zoukankan      html  css  js  c++  java
  • JAVA过滤器(Filter)与拦截器(Interceptor)区别及关系

    相关另一好文:过滤器、监听器、拦截器的区别

    手把手叫你自定义过虑器,并成功配置

    过滤器

    过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
    作用
    请求和回应的过滤,传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。

    Servlet过滤器的基本原理
    在请求进入容器之后,还未进入Servlet之前进行预处理;在请求结束返回给前端之前进行后期处理。处理完成后,它会交给下一个过滤器处理,直到请求发送到目标为止。

    拦截器

    拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。比如日志,安全等。
    拦截器链,就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
    一般拦截器方法都是通过动态代理的方式实现。

    作用
    比如通过它来进行权限验证,或者判断用户是否登陆,或者是像12306 判断当前时间是否是购票时间。

    区别

      ①拦截器是基于动态代理的,而过滤器是基于函数回调。
      ②拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器。
      ③拦截器可以在方法前后,异常前后等调用,而过滤器只能在请求前和请求后各调用一次。
      ④拦截器可以利用依赖注入,因此在Spring框架程序中,优先拦截器。

    1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("before...");
            chain.doFilter(request, response);
            System.out.println("after...");
        }
    

    2.拦截器是被包裹在过滤器之中的。

        @Override
        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("afterCompletion");
        }
    

    看一下执行顺序

    欢迎转载,但未经作者同意必须保留此段声明,否则保留追究法律责任的权利.

    过滤器(Filter)与拦截器(Interceptor)区别:

    1、过滤器是基于函数回调,而拦截器是基于java的反射机制;

    2、过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器

    3、过滤器可以拦截几乎所有的请求(包含对静态资源的请求),而拦截器只拦截action请求(不拦截静态资源请求)

    4、过滤器不能访问action上下文及值栈里的对象,而拦截器都是可以的。

    5、拦截器可以获取spring容器里的对象,而过滤器是不行的

    6、拦截器在action的生命周期内是可以多次调用,而过滤器只在容器初始化时被调用一次。

    7、拦截器是被包裹在过滤器之中。
    ————————————————
    版权声明:本文为CSDN博主「白玉灬风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_34871626/article/details/79185829

    做产品的程序,才是好的程序员!
  • 相关阅读:
    apache+mysql+php+phpmyadmin搭建
    Redis学习笔记(1)Redis安装和启动
    Zlib 引用中出现的问题
    约数
    AC自动机
    当我们说“一切皆对象”时,我们到底在说什么
    Google翻译,3个步骤灭绝人类
    Linux下Gcc生成和使用静态库和动态库详解(转)
    Java基础&笔试题
    SQL基础&笔试题
  • 原文地址:https://www.cnblogs.com/asplover/p/12833353.html
Copyright © 2011-2022 走看看