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

    做产品的程序,才是好的程序员!
  • 相关阅读:
    OleDbCommand 的用法
    递归求阶乘
    C#重写窗体的方法
    HDU 5229 ZCC loves strings 博弈
    HDU 5228 ZCC loves straight flush 暴力
    POJ 1330 Nearest Common Ancestors LCA
    HDU 5234 Happy birthday 01背包
    HDU 5233 Gunner II 离散化
    fast-IO
    HDU 5265 pog loves szh II 二分
  • 原文地址:https://www.cnblogs.com/asplover/p/12833353.html
Copyright © 2011-2022 走看看