1. 自定义拦截器类实现 HandlerInterceptor 接口
实现接口后必须实现三个执行方法,如下
- public boolean preHandle(HttpServletRequest request ,HttpServletResponse response,Object handler) ;此方法在控制器方法前执行,返回值为true时,表示继续执行控制器Controller中的请求处理方法;为false时中断后续执行,跳出。
- public void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mav);在控制器中的方法调用后,且解析视图前执行,可以对请求域中的模型和视图做进一步修改。
- public void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) ;在整个请求完成,即视图渲染结束后执行,可以实现资源清理,记录日志信息等。
2. 配置SpringMVC核心配置文件
要使自定义的拦截器生效,需要对其进行核心文件配置,可以配置全局拦截,指定url模式拦截等信息。
<mvc:interceptors>
// 全局拦截器,拦截所有请求
<bean class=””/>
<mvc:interceptor>
// “/**” 表示拦截所有路径
<mvc:mapping path=”/**” />
// “exclude-mapping” 表示不需要拦截的路径
<mvc:exclude-mapping path=”” />
<bean class=”” />
</mvc:interceptor>
<mvc:interceptor>
// 表示拦截所有以”/hello” 结尾的路径
<mvc:mapping path=”/hello” />
<bean class=”” />
</mvc:interceptor>
</mvc:interceptors>

3. 拦截器执行的流程
3.1 单个拦截器执行


单个拦截器的工作流程
3.2 多个拦截器执行

多个拦截器的工作流程

4. 用户登录拦截测试
4.1 自定义拦截器类LoginInterceptor.java
package com.dc.Intercptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Http session ;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.dc.po.User;
public class LoginInterceptor implements HandlerInterceptor {
/**
* 控制器方法执行前调用
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println(“LoginInterceptor … preHandle”);
String url = request.getRequestURI();
// URL:除了login. jsp 是可以随意访问,其他的都进行拦截
if (url.indexOf(“login”) > 0) {
return true;
}
// 检查是否你登陆
HttpSession session = request.getSession();
User user = (User) session.getAttribute(“USER”);
if (user != null) {
return true;
}
// 不符合条件的:没有登陆的,拦截处理掉
request.setAttribute(“msg”, “你还没有登陆”);
request.getRequestDispatcher(“/WEB-INF/jsp/login.jsp”).forward(request, response);
return false;
}
/**
* 控制器方法调用后,视图解析前
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println(“LoginInterceptor … postHandle”);
}
/**
* 整个请求完成,即视图解析渲染后执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println(“LoginInterceptor … afterCompletion”);
}
}

4.2 配置springmvc-config.xml ,使自定义拦截器生效
<!– 配置 SpringMVC 拦截器 –>
<mvc:interceptors>
<!– 使用 Bean 直接在 <mvc:interceptors> 下配置全局的拦截器,拦截所有的请求 –>
<bean class=”com.dc.Intercptor.CustomIntercptor” />
<mvc:interceptor>
<!– 配置拦截器 UserInterceptor作用的路径 –>
<mvc:mapping path=”/**” />
<mvc:exclude-mapping path=”” />
<bean class=”com.dc.Intercptor.UserInterceptor” />
</mvc:interceptor>
<mvc:interceptor>
<!– 配置拦截器 AdmInterceptor作用的路径 以 /hello 结尾的路径 –>
<mvc:mapping path=”/hello” />
<bean class=”com.dc.Intercptor.AdmInterceptor” />
</mvc:interceptor>
<mvc:interceptor>
<!– 配置拦截器 LoginInterceptor 作用的路径径 –>
<mvc:mapping path=”/**” />
<bean class=”com.dc.Intercptor.LoginInterceptor” />
</mvc:interceptor>
</mvc:interceptors>

4.3 修改对应的控制器类的处理方法
/**
* 用户登录处理
*/
@RequestMapping(value = “/login”, method = RequestMethod.GET)
public String login(User user, Model model, HttpSession session) {
// User 是 com.dc.po 包下的POJO 类
String usernameString = user.getUsername();
String passString = user.getPassword();
if (usernameString != null && usernameString.equals(“老王”)
&& passString != null && passString.equals(123456)) {
// 登录成功,将用户信息添加到Session中
session.setAttribute(“USER”, user);
return “redirect:main”;
}
model.addAttribute(“msg”, “用户没有登陆”);
return “login”;
}

4.4 添加 login.jsp 视图页面
<%@ page language=”java” contentType=”text/ html ; charset=UTF-8″
pageEncoding=”UTF-8″%>
<!DOCTYPE html>
<html>
<head>
<meta charset=”UTF-8″>
<title>登录</title>
</head>
<body>
${msg }
<form action=”${pageContext.request.contextPath }/login” method=”post”>
用户名:<input type=”text” name=”username” />
密码:<input type=”text” name=”password” />
<input type=”submit” value=” 登 录 ” />
</form>
</body>
</html>

在这里就不贴测试结果,大家有兴趣可以自行测试下效果。
今天拦截器就讲解到这里,更深的知识后期更新。