随记二、拦截器(Intercepter)和过滤器(Filter)

本文介绍了Filter过滤器和Intercepter拦截器的概念、应用场景、实现方式以及两者之间的区别,包括触发时机、功能特性、依赖关系和生命周期管理。
摘要由CSDN通过智能技术生成

目录

前言

一、Filter过滤器是什么?

二、Filter过滤器有哪些应用场景?

三、Filter过滤器如何实现?

四、urlPatterns过滤规则

五、Intercepter拦截器是什么?

六、Intercepter拦截器有哪些应用场景?

七、Intercepter拦截器如何实现?

四、addPathPatterns规则

八、最最最重要的小总结

以上小总结个人查阅借鉴,如有侵权联系博主

总结


前言

  今天进行随记二、过滤器和拦截器,在昨天的登录游戏时,突然想到了过滤器和拦截器,因为学习完了springboot已经过了很长的时间,所以竟然已经记不太清楚了,所以在今天闲下来的时间做一个总结,一下是个人见解,可供大家做一个基本的参考和理解

一、Filter过滤器是什么?

  Filter过滤器是JavaWeb三大组件之一(Servlet、Filter、Listener)之一,其实通俗的理解Filter过滤器就是在javaWeb中,通过过滤器能操作你传入的request、response,进行一些业务上的操作,如常用的过滤掉非法的url、统一字符集等。

二、Filter过滤器有哪些应用场景?

  (1)过滤敏感词汇

  (2)统一字符编码

  (3)敏感字符处理

  (4)URL权限控制访问

 

三、Filter过滤器如何实现?

  (1)定义一个类实现Filter接口,重写其所有方法

  (2)配置Filter,Filter实现类加上@WebFilter注解,配置资源的拦截路径,启动类上加入@ServeletComponentScan注解开启Servlet支持

代码如下(示例):

//定义一个类DemoFilter实现Filter接口
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化方法,web服务启动,创建Fliter时调用,只调用一次
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //拦截到请求时,调用方法,可调用多次
        System.out.println("拦截方法执行拦截到请求");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {
        //销毁方法,服务器关闭时调用,只调用一次
        Filter.super.destroy();
    }
}

//如下是启动类FlyPigApplication加入注解支持Servlet

@ServletComponentScan
@SpringBootApplication
public class FlyPigApplication {

    public static void main(String[] args) {
        SpringApplication.run(FlyPigApplication.class, args);
    }
}

四、urlPatterns过滤规则

拦截路径

urlPatterns值含义
拦截具体路径/login只有访问/login路径时,才会被拦截
目录拦截/terms/*访问/terms下所有路径时,都会被拦截
拦截所有/*访问所有的资源都会被拦截

五、Intercepter拦截器是什么?

  Intercepter拦截器是一种动态拦截方法调用的机制,就是在你方法执行前调用一个Intercepter中的方法,或者方法后调用一个Intercepter的方法,如简单的实现:动态代理,或者则方法的前后执行其他的业务逻辑

六、Intercepter拦截器有哪些应用场景?

  (1)登录校验:token的检验识别

  (2)日志记录:记录请求信息的日志

  (3)性能监控:请求的处理时间

七、Intercepter拦截器如何实现?

  (1)定义一个类LoginCheckInterceptor来实现HandlerInterceptor,重写其方法,注意类上需要加入@component注解,将他的bean注入到springMVC容器中

  (2)定义配置类WebConfig实现WebMvcConfigurer,注入LoginCheckInterceptor的对象,在WebConfig类中重写addinterceptors方法,配置拦截路径,注意WebConfig类需要注解@configuration注解标注配置类

代码如下(个人练习编写):

//第一步定义LoginCheckInterceptor类
@Component
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {

    @Override//目标资源方法前执行,true放行,false不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        System.out.println("prehandle方法执行,业务逻辑生成完毕");
        return true;
   
    }

    @Override//目标方法执行后执行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("posthandle方法执行完毕");
    }

    @Override//视图渲染完毕后执行,最后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("视图渲染完毕");
    }
}
//第二步定义WebConfig类
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
    }
}

四、addPathPatterns规则

拦截路径含义举例
/*一级路径能匹配 /login、/emp等,不能匹配 /login/1
/**任意路径能匹配 /dept、/dept/1、/dept/1/2等所有路径
/dept/*/dept 下的一级路径能匹配/dept/1,不能匹配/dept/1/2、/dept
/dept/**/dept下的任意路径能匹配/dept/1、/dept/1/2,不能匹配其他资源路径和/dept

八、最最最重要的小总结

  相信大家都很聪明以上这些对于大家都很easy,同时大家也一定存在一个问题,就是会发现Filter过滤器和Intercpetor拦截器很是相似都是拦截,甚至上面的两个拦截规则都很是相似,所以就会混淆他们两个,在我学习完理解后过了一段时间之后也会这样再回想起来也会混淆,所以在我查询了多方的资料后总结了这两个的异同。

  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的实例,因此使用会更方便。

  7、过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。 

  8、 拦截器(Interceptor):可以拿到你请求的控制器和方法,却拿不到请求方法的参数。

以上小总结个人查阅借鉴,如有侵权联系博主

  


总结

 过滤器和拦截器还是由很大的区别,在实际的开发和应用中大家可以根据情境来灵活选择

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

载着梦想的猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值