• 过滤器


    过滤器

    在Web组件响应客户请求的过程中,可能都会完成一些相同的操作,比如都要先检查客户的IP地址是否位于预定于的拒绝IP地址范围内,如果满足这一条件,就直接向客户端返回拒绝响应客户请求的信息,而不会继续执行后续操作。

    如果在多个Web组件中编写同样的操作,显然会导致代码重复,将这些重复的代码提取出来作为一个公共的模块,这个模块就是过滤器。过滤器能够对一部分客户请求先进性预处理操作,然后再把请求转发给相应的Web组件,等到Web组件生成了响应结果后,过滤器还能对响应结果进行检查和修改,然后再把修改后的响应结果发送给客户。

    20.1 过滤器简介

    过滤器能够对Servlet容器传给Web组件的ServletRequest对象和ServletResponse对象进行检查和修改,过滤器本身并不生成ServletRequest对象和ServletResponse对象,它只为Web组件(Servlet、JSP、HTML)提供如下的过滤功能:

    1.过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头和请求正文中的内容,或者对请求进行预处理操作

    2.过滤器能够在Web组件被调用之后检查ServletResponse对象,修改响应头和响应正文。

    过滤器负责过滤的Web组件可以是Servlet、JSP、HTML文件

     

    过滤器可以检查ServletRequest和ServletResponse对象,并且利用ServletRequestWrapper和ServletResponseWrapper包装类来修改ServletRequest和ServletResponse对象;可以在web.xml文件中为过滤器映射特定的URL,当客户请求访问此URL时,Servlet容器就会先出发过滤器的工作;多个过滤器还可以被串联在一起工作

     

    20.2 创建过滤器

    所有自定义的过滤器类都必须实现javax.servlet.Filter接口,这个接口含有以下必须实现的方法:

    //过滤器的初始化方法,在Web应用启动时,Servlet容器先创建包含了过滤器配置信息的FilterConfig对象,然后创建Filter对象,接着调用Filter对象的init方法,这个方法中可以通过config参数来读取web.xml文件中为过滤器配置的初始化参数,即FilterConfig的getInitParameter(String parameterName)方法,这个方法能获取web.xml文件中为为过滤器配置的初始化参数
    init(FilterConfig config);
    //这个方法中的内容就是过滤操作的内容,当客户端请求的url与在web.xml中为过滤器配置的url-pattern对应的时候,Servlet容器就会调用这个doFilter方法,FilterChain参数用于访问后续过滤器或者Web组件
    doFilter(ServletRequesst req, ServletResponse res, FilterChain chain);
    //Servlet容器在销毁过滤器对象前调用改方法,该方法中可以释放过滤器占用的资源
    destory();

     

    过滤器的生命周期:

    初始化阶段:当Web应用启动时,Servlet容器会加载过滤器类,创建过过滤器配置对象(FilterConfig)和过滤器对象,并调用过滤器对象的init方法

    运行时阶段:客户请求URL与过滤器映射的URL匹配时,Servlet容器调用过滤器的doFilter方法

    销毁阶段:当Web应用终止时,Servlet容器先调用过滤器对象的destory方法,然后销毁过滤器对象

     

     

     

    20.3 发布过滤器

    发布过滤器的两种方法:

    1.在web.xml文件中配置过滤器

     <filter> 
       <!--过滤器名-->
       <filter-name>NoteFilter</filter-name>
       <!--过滤器完整类名-->
       <filter-class>mypack.NoteFilter</filter-class>
    <!--过滤器初始化参数,可以通过 FilterConfig类的实例的getInitParameter(String name)方法获得-->
       <init-param>
         <param-name>ipblock</param-name>
         <param-value>221.45</param-value>
       </init-param>

       <init-param>
         <param-name>blacklist</param-name>
         <param-value>捣蛋鬼</param-value>
       </init-param>

     </filter>

     <filter-mapping>
       <filter-name>NoteFilter</filter-name>
       <!--当客户请求的URL和该过滤器的url-pattern匹配时,Servlet容器调用该过滤器的doFilter()方法-->
       <url-pattern>/note</url-pattern>
     </filter-mapping>

    注意 在web.xml文件中,必须先配置所有的过滤器,在配置Servlet

    如果希望过滤器对任何URL请求都能过滤,可以把url-pattern的值设置为“/*”

     

    2.在过滤器类中用@WebFilter标注来配置过滤器

    示例:

    @WebFilter( 
    filterName = "NoteFilter",
    urlPatterns = "/note",
    initParams = {
    @WebInitParam(name = "ipblock", value = "221.45"),
    @WebInitParam(name = "blacklist", value = "捣蛋鬼")}
    )

    dispatcherTypes属性指定调用过滤器的模式,DispatcherType是一个枚举类,各个枚举值的意义如下:

    DispatcherType.REQUEST: 当客户端直接请求访问待过滤的目标资源时,Web容器会先调用该过滤器

    DispatcherType.FORWARD: 当待过滤的目标资源时通过RequestDispatcher的forward(请求转发)方式被访问时,Web容器会先调用该过滤器

    DispatcherType.INCLUDE: 当待过滤的目标资源时通过RequestDispatcher的include(请求包含)方式被访问时,Web容器会先调用该过滤器

    DispatcherType.ERROR: 当待过滤的目标资源是通过声明式异常处理机制被访问时,Web容器会先调用该过滤器

    DispatcherType.ASYNC: 当待过滤的目标资源是被异步访问时,Web容器会先调用该过滤器

     

     

    dispathcerTypes属性允许有一个或者多个取值:

    示例:

    @WebFilter( 
    filterName = "SampleFilter",
    urlPatterns = {"/*.jsp","/*.do"},
    dispatcherTypes={DispatcherType.REQUEST,DispatcherType.FORWARD}
    )

     

    20.4 串联过滤器

     

  • 相关阅读:
    Java集合概述
    高可用性、负载均衡的mysql集群解决方案
    openOffice转换的时候乱码在linux下使用openOffice的时候发现在转换后出现了乱码
    (转)Linux安装SwfTools-0.9.2安装事,在执行make install时报错
    (转)java使用jsp servlet来防止csrf 攻击的实现方法
    (转)卫语句
    python的全局变量玩法还挺特别的
    那万恶的ssh真是麻烦
    关于有符号与无符号的字节
    开源而又强大的迷你型web服务器推荐
  • 原文地址:https://www.cnblogs.com/foodie-nils/p/14883933.html
Copyright © 2020-2023  润新知