22 7 2020 ## 目录: [TOC] ## HandlerInterceptor简介 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action 执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。 ## 1、定义实现类 ###### 定义一个Interceptor **非常简单方式也有几种,我这里简单列举两种** 类要实现Spring 的HandlerInterceptor 接口 类继承实现了HandlerInterceptor 接口的类,例如 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapte `我这里使用第一种方式` ## 2、HandlerInterceptor方法介绍 ```java 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:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理; 2. postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博主就基本不怎么用了); 3. afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染了页面) ** 接下来让我们来实现简单的登录拦截器吧** ## 3、拦截器实现 ###### 新建 LoginInterceptor 实现 HandlerInterceptor接口 ``` public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object obj = request.getSession().getAttribute("loginUser");//(你的用户信息session) // 如果user不为空则放行 if (null != obj) { return true; } // 否则拦截并跳转到登录 response.sendRedirect("/admin/login"); return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } ``` ###### 新建WebAppConfigurer 实现WebMvcConfigurer接口 ``` public class WebAppConfigurer implements WebMvcConfigurer { @Autowired private LoginInterceptor loginAuthenticator; /** * 注册拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginAuthenticator).addPathPatterns("/admin/**") .excludePathPatterns("/admin/login") .excludePathPatterns("/admin/getLogin"); // - /**: 匹配所有路径 // - /admin/**:匹配 /admin/ 下的所有路径 // - /admin/*:只匹配 /admin/login,不匹配 /secure/login/tologin ("/*"只匹配一级子目录,"/**"匹配所有子目录) } .......//其实下面还有很多方法我这里就省略了,过滤器可以添加多个。 } ``` **其实以前都是继承WebMvcConfigurerAdapter类 不过springBoot2.0以上 WebMvcConfigurerAdapter 方法过时,有两种替代方案:** 继承WebMvcConfigurationSupport 实现WebMvcConfigurer **但是继承WebMvcConfigurationSupport会让Spring-boot对mvc的自动配置失效。根据项目情况选择。现在大多数项目是前后端分离,并没有对静态资源有自动配置的需求所以继承WebMvcConfigurationSupport也未尝不可。** 非特殊说明,本文版权归 余情 所有,转载请注明出处. 本文标题: SpringBoot之HandlerInterceptor拦截器的使用 本文网址: http://www.yuqingbolg.cn/read/155 延伸阅读 echarts如何实现关键词云图 [2020-07-18 18:22:57] Java实现简单上传图片到阿里云对象存储OSS [2020-07-16 16:51:55] Error:java: OutOfMemoryError: insufficient memory [2021-04-16 10:49:08] 单点登录原理 [2020-12-30 17:21:20] MySQL 优化问题 [2020-11-19 14:22:15] 发表评论 提交评论