相关推荐recommended
过滤器和拦截器的区别
作者:mmseoamin日期:2024-04-01

文章目录

  • 一、拦截器和过滤器的区别
    • 1、过滤器
      • 1、实现方式
      • 2、应用场景
      • 2、拦截器
        • 1、实现方式
        • 2、应用场景
        • 总结

          一、拦截器和过滤器的区别

          1、过滤器拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

          2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

          3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射

          4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。

          5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。

          6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

          过滤器和拦截器的区别,在这里插入图片描述,第1张

          最简单明了的区别:

          1.过滤器可以修改request,而拦截器不能

          2.过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境

          3.拦截器可以调用IOC容器中的各种依赖,而过滤器不能

          4.过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

          调用方法流程如下:

          过滤器和拦截器的区别,在这里插入图片描述,第2张

          1、过滤器

          1、实现方式

          1.使用spring boot提供的FilterRegistrationBean注册Filter

          定义Filter:

          public class MyFilter implements Filter {
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  Filter.super.init(filterConfig);
              }
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  log.info("MyFilter");
              }
              @Override
              public void destroy() {
                  Filter.super.destroy();
              }
          }
          

          注册Filter:

          @Slf4j
          @Order(1)
          public class MyFilter implements Filter {
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  Filter.super.init(filterConfig);
              }
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  log.info("-----------------------MyFilter");
                  filterChain.doFilter(servletRequest,servletResponse);
              }
              @Override
              public void destroy() {
                  Filter.super.destroy();
              }
          

          2.使用原生servlet注解定义Filter

          @WebFilter(filterName = "LoginFilter" ,urlPatterns = "/*")
          @Slf4j
          @Order(2)
          public class LoginFilter implements Filter {
              @Override
              public void init(FilterConfig filterConfig) throws ServletException {
                  log.info("进入过滤器init");
                  Filter.super.init(filterConfig);
              }
              @Override
              public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  log.info("进入过滤器"+servletRequest.getRemoteAddr()+"|"+servletRequest.getRemoteHost()+"|"+servletRequest.getLocalPort()+"|"+servletRequest.getServerPort()
                  );
                  filterChain.doFilter(servletRequest,servletResponse);
              }
              @Override
              public void destroy() {
                  log.info("进入过滤器destroy");
                  Filter.super.destroy();
              }
          

          这里直接用@WebFilter就可以进行配置,同样,可以设置url匹配模式,过滤器名称等。这里需要注意一点的是@WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的。除了这个注解以外,我们还需在启动类中加另外一个注解:@ServletComponetScan,指定扫描的包。

          2、应用场景

          1)过滤敏感词汇(防止sql注入)

          2)设置字符编码

          3)URL级别的权限访问控制

          4)压缩响应信息

          2、拦截器

          1、实现方式

          1.自定义拦截器

          @Slf4j
          public class AuthInterceptor implements HandlerInterceptor {
              @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
                  log.info("preHandle");
                  String clientIP = ServletUtil.getClientIP(httpServletRequest);
                  log.info("访问IP:"+clientIP);
                  log.info("请求路径:{}", httpServletRequest.getRequestURI());
                  return true;
              }
              @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
                  log.info("postHandle");
              }
              @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
                  log.info("afterCompletion");
              }
          

          2.注册拦截器

          @Configuration
          public class WebMvcConfig extends WebMvcConfigurationSupport {
              private final AuthInterceptor authInterceptor;
              public WebMvcConfig(AuthInterceptor authInterceptor) {
                  this.authInterceptor = authInterceptor;
              }
              @Override
              protected void addInterceptors(InterceptorRegistry registry) {
                  registry.addInterceptor(authInterceptor)
                          .addPathPatterns("/**");
              }
          }
          

          2、应用场景

          1.登录验证,判断用户是否登录。

          2.权限验证,判断用户是否有权限访问资源,如校验token

          3.日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。

          4.处理cookie、本地化、国际化、主题等。

          5.性能监控,监控请求处理时长等。

          6.通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)


          总结

          以上为个人学习过程中对java的一些学习总结,如有错误,欢迎各位批评指导,如有侵权,请联系本人删除,如果觉得有一点帮助麻烦点个赞加收藏!谢谢!