zoukankan      html  css  js  c++  java
  • Introduction of Servlet Filter

    过滤器是一个可以转换请求或响应的标头和内容(或两者)的对象。过滤器与Web组件的不同之处在于过滤器通常不会自行创建响应。相反,过滤器提供可以“附加”到任何类型的Web资源的功能。因此,过滤器不应该对作为过滤器的Web资源有任何依赖性; 这样,它可以由多种类型的Web资源组成。

    过滤器可以执行的主要任务如下。

    • 查询请求并采取相应措施。

    • 阻止请求和响应对进一步传递。

    • 修改请求标头和数据。您可以通过提供请求的自定义版本来完成此操作。

    • 修改响应标头和数据。您可以通过提供自定义版本的响应来完成此操作。

    • 与外部资源互动。

    过滤器的应用包括身份验证,日志记录,图像转换,数据压缩,加密,标记化流,XML转换等。

    您可以按特定顺序配置由一个零个,一个或多个过滤器链过滤的Web资源。在部署包含组件的Web应用程序时指定此链,并在Web容器加载组件时实例化该链。

     

    编程过滤器

    过滤API由定义FilterFilterChain和 FilterConfig在所述接口javax.servlet包。您可以通过实现Filter接口来定义过滤器

    使用@WebFilter注释在Web应用程序中定义过滤器。此批注在类上指定,并包含有关正在声明的过滤器的元数据。带注释的过滤器必须至少指定一个URL模式。这是通过 在注释上使用urlPatternsor value属性来完成的。所有其他属性都是可选的,具有默认设置。value当注释上的唯一属性是URL模式时,请使用该属性; 在使用urlPatterns其他属性时使用该属性。

    使用@WebFilter注释注释的必须实现该 javax.servlet.Filter接口。

    要将配置数据添加到过滤器,请指定注释initParams 属性@WebFilterinitParams属性包含@WebInitParam注释。以下代码段定义了一个过滤器,指定了一个初始化参数:

    import javax.servlet.Filter;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    
    @WebFilter(filterName = "TimeOfDayFilter",
    urlPatterns = {"/*"},
    initParams = {
        @WebInitParam(name = "mood", value = "awake")})
    public class TimeOfDayFilter implements Filter {
        ...

    Filter接口中最重要的方法doFilter是传递请求,响应和过滤器链对象。此方法可以执行以下操作。

    • 检查请求标头。

    • 如果过滤器希望修改请求标头或数据,请自定义请求对象。

    • 如果过滤器希望修改响应标头或数据,请自定义响应对象。

    • 调用过滤器链中的下一个实体。如果当前过滤器是链中以目标Web组件或静态资源结束的最后一个过滤器,则下一个实体是链末尾的资源; 否则,它是WAR中配置的下一个过滤器。过滤器通过调用doFilter链对象上方法来调用下一个实体,传入它所调用的请求和响应,或者它可能创建的包装版本。或者,过滤器可以选择通过不调用调用下一个实体来阻止请求。在后一种情况下,过滤器负责填写响应。

    • 在调用链中的下一个过滤器后检查响应头。

    • 抛出异常以指示处理中的错误。

    除此之外doFilter,您还必须实现initdestroy 方法。init当实例化过滤器时,容器调用方法。如果您希望将初始化参数传递给过滤器,则可以从FilterConfig传递给对象中 检索它们init

     

    编程自定义请求和响应

    过滤器有许多方法可以修改请求或响应。例如,过滤器可以向请求添加属性,也可以在响应中插入数据。

    修改响应的过滤器通常必须在响应返回到客户端之前捕获响应。为此,您将一个替代流传递给生成响应的servlet。备用流阻止servlet在完成时关闭原始响应流,并允许过滤器修改servlet的响应。

    要将此替换流传递给servlet,过滤器会创建一个响应包装器,该响应包装器会覆盖getWritergetOutputStream 返回此预留流的方法。包装器被传递给doFilter过滤器链的 方法。包装器方法默认调用包装的请求或响应对象。

    要覆盖请求方法,请将请求包装在扩展名为ServletRequestWrapper的对象中HttpServletRequestWrapper要覆盖响应方法,请将响应包装在扩展ServletResponseWrapper扩展的对象中HttpServletResponseWrapper

     

    指定过滤器映射

    Web容器使用筛选器映射来决定如何将筛选器应用于Web资源。筛选器映射按名称将筛选器与Web组件匹配,或按URL模式匹配Web资源。按照过滤器映射出现在WAR的过滤器映射列表中的顺序调用过滤器。您可以使用NetBeans IDE或使用XML手动编写列表来为其部署描述符中的WAR指定过滤器映射列表。

    如果要将每个请求记录到Web应用程序,请将命中计数器筛选器映射到URL模式/*

    您可以将过滤器映射到一个或多个Web资源,并且可以将多个过滤器映射到Web资源。这在示出 图18-1,其中,过滤器F1被映射到的servlets S1,S2,和S3; 过滤器F2映射到servlet S2; 并且过滤器F3映射到servlet S1和S2。

    图18-1 Filter-to-Servlet映射

    回想一下,过滤器链是传递给doFilter过滤器方法的对象之一 该链通过过滤器映射间接形成。链中的过滤器顺序与过滤器映射在Web应用程序部署描述符中的显示顺序相同。

    当过滤器映射到servlet S1时,Web容器调用doFilterF1 的 方法。doFilterS1的过滤器链中的每个过滤器方法由链中的前一过滤器通过该chain.doFilter方法调用因为S1的滤波器链包含滤波器F1和F3,所以F1的调用chain.doFilter调用doFilter滤波器F3 方法。当F3的doFilter方法完成时,控制返回F1的doFilter方法。

  • 相关阅读:
    MySQL 8 新特性之Clone Plugin
    哈尔滨工业大学(威海)第九届ACM程序设计竞赛
    我回来了
    正则表达式(五):正则表达式的高阶使用
    正则表达式(四):正则表达式中的分组的概念
    正则表达式(三):正则表达式中的重复
    正则表达式(二):正则表达式的元字符
    正则表达式(一):正则表达式的概念
    Android NDK 跨平台构建工具 CMake 使用笔记
    字节序问题之大小端模式讲解
  • 原文地址:https://www.cnblogs.com/April315/p/10587730.html
Copyright © 2011-2022 走看看