五、spring拦截器
springmvc自定义拦截器需要实现HandlerInterceptor接口
1)preHandle : 在进入控制器方法之前进行拦截处理
boolean类型的返回值
true:放行 (进入下一个拦截器或者进入控制器方法)
false:拦截
2)postHandle : 处理了控制器方法之后,执行
对响应结果进行处理
3)afterCompletion : 所有流程全部正确执行完成
1.preHandler
2.控制器方法
3.postHandler
4.springMVC默认servlet(dispatcherServlet)
在去执行此方法
1.简单的登录拦截器
public class interceptor implements HandlerInterceptor {
// 拦截请求
/**
* *login - 登录
* *findAllUser - 查询全部用户
*
* 登录检查
* 1.获取session
* 2.从session中获取数据
* 3.如果session数据为null,拦截
* * 请求转发到登录页面
* 4.如果已经登录
* * 放行:进入到控制器方法中
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
System.out.println("1拦截器执行");
if (user==null) {
response.sendRedirect("login.jsp");
return false;
}else {
return true;
}
}
// 响应
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("1响应执行");
}
// 响应结束
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("1请求结束了");
}
}
2.多拦截器执行顺序
- preHandle:顺序执行
- postHandle:逆序执行
afterCompletion:逆序执行
拦截器的配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login.jsp" />
<mvc:exclude-mapping path="/login" />
<bean class="cn.it.demo.interceptor.interceptor"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/login.jsp" />
<mvc:exclude-mapping path="/login" />
<bean class="cn.it.demo.interceptor.interceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器2
public class interceptor2 implements HandlerInterceptor {
/**
*
*/
// 拦截请求
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
System.out.println("2拦截器执行");
return true;
/**
* 第一个拦截器拦截后执行结果
* return false;
* 1拦截器执行 说明当拦截器拦截了响应后,只执行拦截,不会执行拦截器最终方法
*/
/**
* 第二个拦截器拦截后执行结果
* return false;
* 1拦截器执行
* 2拦截器执行
* 1请求结束了
* 说明当拦截器放行后,只要响应完成必然执行最终方法,
* 但是响应方法执行取决于请求是否成功到达控制器方法
*/
/**
* 都放行执行结果
* return false;
* 1拦截器执行
* 2拦截器执行
* 1请求结束了
* 1拦截器执行
* 2拦截器执行
* 1请求结束了
* 说明:多个拦截器执行的顺序为pre方法顺序执行,post、after方法逆序执行,
* 只要该拦截器放行,响应结束后after方法就会执行,
* 只有控制器方法执行,该拦截器post方法才会执行
* 只要匹配到拦截器必然执行pre方法
*
*/
}
// 响应
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("2响应执行");
}
// 响应结束
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("2请求结束了");
}
}