使用场景
记录web请求的相关日志,可以做信息监控,统计,分析
检查web的访问权限,例如发现用户没有登录后,重定向到登录页面。
打开关闭数据库连接–预处理打开,后处理关闭,可以避免所有的业务方法中都编写相似的类。
Spring MVC的请求流程
HandlerInterceptor接口
1 2 3 4 5 6 7 8 9 10 11 12 13
| public interface HandlerInterceptor { boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception; }
|
1.preHandle():预处理回调方法,若方法返回值为true,请求继续(调用下一个拦截器或处理器方法);若方法返回值为false,请求处理流程中断,不会继续调用其他的拦截器或处理器方法,此时需要通过response产生响应;
2.postHandle():后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时可以通过modelAndView对模型数据进行处理或对视图进行处理
3.afterCompletion():整个请求处理完毕回调方法,即在视图渲染完毕时调用
实例:用户登录检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class LoginInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (request.getSession().getAttribute(Constants.USER_SESSION_ATTR) != null) { return true; } response.sendRedirect("/"); return false; } }
|
配置Interceptor
1 2 3 4 5 6 7 8 9 10
| @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/account/*").excludePathPatterns("/"); } }
|