Springboot过滤器和拦截器详解及使用场景( 二 )
方式二:(使用原生servlet注解定义Filter )
// 注入spring容器@Component // 定义filterName 和过滤的url@WebFilter(filterName = "my2Filter" ,urlPatterns = "/*") public class My2Filter implements Filter {@Override public void init(FilterConfig filterConfig) throws ServletException {}@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filter2");}@Override public void destroy() {}}
这里直接用@WebFilter就可以进行配置 , 同样 , 可以设置url匹配模式 , 过滤器名称等 。 这里需要注意一点的是@WebFilter这个注解是Servlet3.0的规范 , 并不是Spring boot提供的 。 除了这个注解以外 , 我们还需在启动类中加另外一个注解:@ServletComponetScan , 指定扫描的包 。
三、拦截器的配置实现拦截器可以通过继承 HandlerInterceptorAdapter类也可以通过实现HandlerInterceptor这个接口 。 另外 , 如果preHandle方法return true , 则继续后续处理 。
首先我们实现拦截器类:
public class LogCostInterceptor implements HandlerInterceptor { long start = System.currentTimeMillis();@Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {start = System.currentTimeMillis(); return true;}@Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("Interceptor cost="+(System.currentTimeMillis()-start));}@Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}}
我们还需要实现HandlerInterceptor这个接口 , 这个接口包括三个方法 , preHandle是请求执行前执行的 , postHandler是请求结束执行的 , 但只有preHandle方法返回true的时候才会执行 , afterCompletion是视图渲染完成后才执行 , 同样需要preHandle返回true , 该方法通常用于清理资源等工作 。 除了实现上面的接口外 , 我们还需对其进行配置:
@Configuration public class InterceptorConfig extends WebMvcConfigurerAdapter {@Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry);}}
这里我们继承了WebMVCConfigurerAdapter , 这里我们重写了addInterceptors这个方法 , 进行拦截器的配置 , 主要配置项就两个 , 一个是指定拦截器 , 第二个是指定拦截的URL 。
坑坑坑:拦截器不生效常见问题:1)是否有加@Configuration2)拦截路径是否有问题 ** 和 *3)拦截器最后路径一定要 “/**” ,如果是目录的话则是 /*/
总结一下:创建拦截器需要两步:
1、自定义拦截器2、注册拦截器
四、应用场景拦截器是在DispatcherServlet这个servlet中执行的 , 因此所有的请求最先进入Filter , 最后离开Filter 。 其顺序如下 。
Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter
拦截器应用场景拦截器本质上是面向切面编程(AOP) , 符合横切关注点的功能都可以放在拦截器中来实现 , 主要的应用场景包括:
- 登录验证 , 判断用户是否登录 。
- 权限验证 , 判断用户是否有权限访问资源 , 如校验token
- 日志记录 , 记录请求操作日志(用户ip , 访问时间等) , 以便统计请求访问量 。
- 处理cookie、本地化、国际化、主题等 。
- 性能监控 , 监控请求处理时长等 。
- 通用行为:读取cookie得到用户信息并将用户对象放入请求 , 从而方便后续流程使用 , 还有如提取Locale、Theme信息等 , 只要是多个处理器都需要的即可使用拦截器实现)
文章插图
- 中国|浅谈5G移动通信技术的前世和今生
- 芯片|华米GTS2mini和红米手表哪个好 参数功能配置对比
- 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面
- 二维码|村网通?澳大利亚一州推出疫情追踪二维码 还考虑采用人脸识别和地理定位
- 不到|苹果赚了多少?iPhone12成本不到2500元,华为和小米的利润呢?
- 机器人|网络里面的假消息忽悠了非常多的小喷子和小机器人
- 华为|骁龙870和骁龙855区别都是7nm芯片吗 性能对比评测
- 花15.5亿元与中粮包装握手言和 加多宝离上市又进一步?|15楼财经 | 清远加多宝
- 和谐|人民日报海外版今日聚焦云南西双版纳 看科技如何助力人象和谐
- 内容|浅谈内容行业的一些规律和壁垒,聊聊电商平台孵化小红书难点(外部原因)