一、前言
Spring和SpringBoot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,之前我看到过一篇相关系列的文章,讲述的还比较详细,给大家参考参考:拦截器与过滤器的区别,下面说一下SSM项目中自定义拦截器的实现。
二、自定义拦截器
自定义拦截器类,写一个类实现 HandlerInterceptor 接口,然后重写 里面的 preHandle()、postHandle()、afterCompletion()方法
// return true表示放行, return false表示拦截,不向下执行
public class Interceptor1 implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
log.info("preHandle:请求前调用");
//返回 false 则请求中断
//判断用户是否登陆 如果没有登陆 重定向到登陆页面 不放行 如果登陆了 就放行了
String requestURI = request.getRequestURI();
if(!requestURI.contains("/login")){
String username = (String) request.getSession().getAttribute("USER_SESSION");
if(null == username){
response.sendRedirect(request.getContextPath() + "/login.action");
return false;
}
}
return true;
}
/**
* 在业务处理器处理请求执行完成后,生成视图之前执行的动作
* 可在modelAndView中加入数据,比如当前时间
*/
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView modelAndView)
throws Exception {
if(modelAndView != null){ //加入当前时间
modelAndView.addObject("var", "测试postHandle");
}
log.info("postHandle:请求后调用");
}
/**
* 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
*
* 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
*/
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");
}
}
preHandle
预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现);
返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;
postHandle
后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
afterCompletion
整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
preHandle
- 调用时间:Controller方法处理之前
- 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
- 若返回false,则中断执行,注意:不会进入afterCompletion
postHandle
- 调用前提:preHandle返回true
- 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
- 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
- 备注:postHandle虽然post打头,但post、get方法都能处理
afterCompletion
- 调用前提:preHandle返回true
- 调用时间:DispatcherServlet进行视图的渲染之后
- 多用于清理资源
三、springmvc.xml装在拦截器配置
在springmvc的xml配置文件中, 来构建拦截器, 拦截上面的controller
<!-- Springmvc的拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器 -->
<mvc:interceptor>
<!-- 具体匹配原则可以百度 -->
<!-- 对controller的请求url路径进行拦截,匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录 -->
<mvc:mapping path="/**"/>
<!-- 自定义的拦截器类 -->
<bean class="com.iss.springmvc.interceptor.Interceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
四、更多好文
SpringMVC拦截器的使用详解:https://blog.youkuaiyun.com/xiaokang123456kao/article/details/72831049