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信息等 , 只要是多个处理器都需要的即可使用拦截器实现)
过滤器应用场景【Springboot过滤器和拦截器详解及使用场景】1)过滤敏感词汇(防止sql注入)2)设置字符编码3)URL级别的权限访问控制4)压缩响应信息
Springboot过滤器和拦截器详解及使用场景文章插图