SpringMVC——(四)拦截器

2018-11-15 23:43:00     

一、前期准备

  • jar包准备,前面的博客有提供,都导入就完事了

二、拦截器实现登录验证

1.在eclipse中新建项目【SpringMVCTest03】使用dynamic web project的方式,引入jar包到【lib】目录下,在【src/top.bounds.entity/】目录下新建User实体类如下代码:

package top.bounds.entity;

public class User {

	private String username;
	private String pwd;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}


2.在【WebContent/view/】目录下新建login.jsp,表单提交方式采用post的方式(记得在web.xml配置中文乱码过滤)代码如下:

	<form action="${pageContext.request.contextPath}/loginIn" method="post">
		<input type="text" name="username" /><br/><br/>
		<input type="password" name="pwd" /><br/><br/>
		<input type="submit" value="登录" /><br/><br/>
	</form>

3.在【src/top.bounds.controller/】包下新建Login类,如下代码:

package top.bounds.controller;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import top.bounds.entity.User;

@Controller
public class Login {

	/**
	 * 在拦截器设置了loginIn不会被拦截
	 * @param user
	 * @param session
	 * @return
	 */
	@RequestMapping(value = "/loginIn")
	public ModelAndView loginIn(User user, HttpSession session) {
		session.setAttribute("username", user.getUsername());
		ModelAndView mav = new ModelAndView();
		mav.addObject("user", user);
		mav.addObject("msg","这里是没被拦截。。。");
		mav.setViewName("show");
		return mav;
	}

	/**
	 * 此路径会被拦截
	 * @return
	 */
	@RequestMapping(value = "/loginOut")
	public ModelAndView loginOut() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("msg","这里被拦截。。。");
		mav.setViewName("show");
		return mav;
	}
}


4.在【src/top.bounds.interceptor/】包下新建IndexInterceptor类继承HandlerInterceptorAdapter类,重写(@Override)三个方法preHandle() postHandle() afterCompletion()如下代码:

package top.bounds.interceptor;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class IndexInterceptor extends HandlerInterceptorAdapter {

	/*
	 * 进入@Controller之前执行该方法
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		System.out.println("preHandle(), 在访问Controller之前被调用");
		//类似设置白名单,带有loginIn路径放行
		if(request.getRequestURI().indexOf("loginIn")>0)
			return true;
		if (request.getSession().getAttribute("username") != null)
			return true;
		request.getRequestDispatcher("/view/login.jsp").forward(request, response);
		return false;
	}

	/**
	 * 在访问@Controller之后,访问.jsp视图之前执行该方法
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle(), 在访问Controller之后,访问视图之前被调用,这里可以注入一个时间到modelAndView中,用于后续视图显示");
		modelAndView.addObject("date", "由拦截器生成的时间:" + new Date());
	}

	/**
	 * 在访问.jsp视图之后执行该方法
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {

		System.out.println("afterCompletion(), 在访问视图之后被调用");
	}

}
  • 在==preHandle()==方法中做一些路径以及session的验证功能

5.在【WebContent/config/】目录下新建springMVC-servlet.xml配置文件设置拦截器。如下代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	 http://www.springframework.org/schema/context 
	 http://www.springframework.org/schema/context/spring-context-3.2.xsd
	 http://www.springframework.org/schema/mvc
	 http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">

	<!-- 扫描controller(controller层注入) -->
	<context:component-scan base-package="top.bounds.controller" />
	<!--配置对@Controller标签的支持 -->
	<mvc:annotation-driven />
	<mvc:interceptors>   
        <mvc:interceptor>
        	<!-- 拦截所有路径-->    
            <mvc:mapping path="/**"/>
            <bean class="top.bounds.interceptor.IndexInterceptor"/>     
        </mvc:interceptor> 
        <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 --> 
    </mvc:interceptors>
    <!-- 前置控制器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/" />
		<property name="suffix" value=".jsp" />
	</bean>
</beans>

6.在【WEB-INF/jsp/】目录下新建show.jsp用于显示数据,如下代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>这里是WEB-INF底下的安全路径!</p>
	<p>${date}</p>
	<p>${user.username}</p>
	<p>${user.pwd}</p>
	<p>${msg}</p>
</body>
</html>

7.分别访问如下路径并且结合控制台查看效果:

  • http://localhost:8080/SpringMVCTest02/view/login.jsp
  • http://localhost:8080/SpringMVCTest02/loginIn
  • http://localhost:8080/SpringMVCTest02/loginOut

三、总结

  1. preHandle()方法:在业务处理器(@Controller)处理请求之前被调用。
  • 如果返回false则不会再继续执行其他两个拦截器
  • 如果返回true执行下一个拦截器,直到所有的拦截器都执行完毕。再执行被拦截的Controller...
  1. postHandle()方法:在业务处理器(@Controller)处理请求执行完成后,生成视图之前执行的动作
  • 可在modelAndView中加入数据,比如当前时间
  1. afterCompletion()方法:DispatcherServlet完全处理完请求后被调用
  • 可用于清理资源等

ps:本篇博客源码下载链接:https://pan.baidu.com/s/1l8bGIpHLurTv366bM8smfQ 密码:0tw1
SpringMVC——(三)文件上传下载

一、前期准备jar包准备,专门有提供文件上传下载的jar包,具体哪些我也不记得了,前面的博客有提供,都导入就完事了二、文件上传1.在eclipse中新建项目【SpringMVCTest02】使用dynamic web project的方式,引入jar包到【lib】目录下,在【src/top.bounds.entity/】目录下新建FileEntity实体类并且使用*@Component*注解,如下代码:package top.bounds.entity; import org.springframework.stereotype.Component; @Component public class FileEntity { //保存文件名 private String name; //保存文件路径 private String filePath; public String getName() { return name;

MyBatis——(一)CRUD

一、摘要MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 二、快速入门 jar包准备:点击这里直接下载mybatis-3.4.2.jarmysql-connect-java-5.0.8-bin.jar 创建Java Project项目并且导入相关jar包,在【src/dao】目录下新建Teacher实体类,代码如下:package dao; public class Teacher { private int id;

 发表评论