• 过滤器(Filter)和拦截器(Interceptor)


    过滤器(Filter)

    Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序.它依赖于servlet容器,在实现上,基于函数回调,它可以对几乎所有请求进行过滤

    它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

    我们先来看一下Filter接口的内容吧

    Filter接口有两个默认方法:

      init() : 初始化拦截器

      destroy() : 销毁拦截器,用于资源的回收

    一个抽象方法:

      doFilter() : 该方法有三个形参,分别是ServletRequest, ServletResponse和FilterChain.

             每一次被拦截的请求都会调用该方法。该方法将容器的请求和响应作为参数传递进来, FilterChain 用来调用下一个 Filter

    怎么使用过滤器?

    有两个步骤:

    1.编写过滤器类,实现Filter接口

    public class TestFilter extends Filter {
        @Override
        protected void doFilter(HttpServletRequest request, HttpServletResponse 
                 response, FilterChain filterChain) throws ServletException, IOException {
            //doFilter()前的代码是对用户请求进行预处理
            System.out.println("Before");
            //执行Filter链中的下一个Filter
            filterChain.doFilter(request, response);
            //doFilter()后的代码是对用户请求进行后处理
            System.out.println("After");
        }
    } 

    2.在web.xml中,配置过滤器

    <filter>
        <description>测试过滤器</description>
        <filter-name>TestFilter</filter-name>
        <filter-class>com.test.filtes.TestFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>TestFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping> 

    拦截器(Interceptor)

    拦截器(Interceptor)和Servlet无关,它依赖于Web框架,在SpringMVC中就依赖于SpringMVC框架,由SpringMVC框架实现.在Struts2中同理

    在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用.

    就是在action的前,后,甚至抛出异常时进行处理.比如动态代理就是拦截器的简单实现,

    由于拦截器基于框架,所以在拦截器中,所有Spring的bean都可以操作,

    SpringMVC的拦截器基于HandlerInterceptor接口来实现,所以只要实现HandlerInterceptor接口或者继承它的实现类,

    就可以自定义拦截器.

    下面是HandlerInterceptor接口

    preHandle()是在action前执行的方法,返回true继续执行,返回false则结束请求

    postHandle()是在当前请求处理之后,在DispatcherServlet进行视图渲染之前执行的方法

    afterCompletion()是在视图渲染完成后(即整个请求结束之后),执行的方法,用来进行资源清理的操作

    怎么使用拦截器

    1.定义拦截器类

    public class BaseInterceptor implements HandlerInterceptor{
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, 
                          Object arg2) throws Exception {
        System.out.println("Before...");
        return true; 
        }
    
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, 
                          Object arg2, ModelAndView arg3) throws Exception {
        System.out.println("渲染试图前,action执行后...");
        }
    
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse 
                          arg1, Object arg2, Exception arg3)
        System.out.println("整个请求结束之后");
    }
    

      

    2.在SpringMVC配置文件中注册拦截器

    <mvc:interceptors>
        <!-- 如果直接配置bean,代表对所有请求都拦截 -->
        <bean name="baseInterceptor" class="com.scorpios.interceptor.BaseInterceptor" />
        <mvc:interceptor> 
            <!-- 对/test.html路径进行拦截 -->
            <mvc:mapping path="/test.html"/>
            <!-- 特定的拦截器 -->
            <bean class="com.scorpios.interceptor.TestInterceptor" /> 
        </mvc:interceptor>
    <mvc:interceptors/>
    

      

    过滤器和拦截器的区别

    FilterInterceptorSummary
    Filter 接口定义在 javax.servlet 包中 接口 HandlerInterceptor 定义在org.springframework.web.servlet 包中  
    Filter 定义在 web.xml 中  Interceptor配置在springMVC配置文件中  
    Filter在只在 Servlet 前后起作用。Filters 通常将 请求和响应(request/response) 当做黑盒子,Filter 通常不考虑servlet 的实现。 拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。允许用户介入(hook into)请求的生命周期,在请求过程中获取信息,Interceptor 通常和请求更加耦合。 在Spring构架的程序中,要优先使用拦截器。几乎所有 Filter 能够做的事情, interceptor 都能够轻松的实现
    Filter 是 Servlet 规范规定的。 而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。 使用范围不同
    Filter 是在 Servlet 规范中定义的,是 Servlet 容器支持的。 而拦截器是在 Spring容器内的,是Spring框架支持的。 规范不同
    Filter 不能够使用 Spring 容器资源 拦截器是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如 Service对象、数据源、事务管理等,通过IoC注入到拦截器即可 Spring 中使用 interceptor 更容易
    Filter 是被 Server(like Tomcat) 调用 Interceptor 是被 Spring 调用 因此 Filter 总是优先于 Interceptor 执行

    两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的

    Filter应用场景:

      在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等

    Interceptor应用场景:

           Filter能做的,Interceptor都能做,推荐使用拦截器.

    过滤器和拦截器的执行顺序

     

    Filter过滤请求的字符集编码

        <filter>
            <description>字符集过滤器</description>
            <filter-name>encodingFilter</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <description>字符集编码</description>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

      

  • 相关阅读:
    第一次开发分享的经验教训
    开发人员的 Linux 命令学习清单
    代码质量基本准则
    职业发展思考(二)
    软件调试的基本技巧
    多数据源的动态配置与加载使用兼框架交互的问题调试
    对象与并发:概述
    编程模式: 回调
    创新式开发探索(一) —— 开篇
    Linux 命令学习示例: tr
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10732128.html
Copyright © 2020-2023  润新知