当前位置: > Linux服务器 > Tomcat >

tomcat容器提供的过滤器Filters【译】

时间:2015-10-06 22:52来源:www.it.net.cn 作者:IT网

目录[-]

  • 介绍
  • AddDefaultCharsetFilter
  • 说明
  • Filter Class Name
  • 初始化参数
  • CorsFilter
  • 介绍
  • Filter Class Name
  • 初始化参数
  • CORSFilter 和 HttpServletRequest attributes
  • CsrfPreventionFilter
  • 说明
  • Filter Class Name
  • 初始化参数
  • ExpiresFilter
  • FailedRequestFilter
  • 介绍
  • Filter Class Name
  • HttpHeaderSecurityFilter
  • 介绍
  • Filter Class Name
  • 初始化参数
  • RemoteAddrFilter
  • RemoteHostFilter
  • RemoteIpFilter
  • RequestDumperFilter
  • 介绍
  • Filter Class Name
  • 简单的配置
  • SetCharacterEncodingFilter
  • 介绍
  • Filter Class Name
  • 初始化参数
  • WebdavFixFilter
  • 介绍
  • Filter Class Name

介绍

Tomcat默认提供了许多可用于Web应用程序的过滤器,可以通过tomcat的$CATALINA_BASE/conf/web.xml或通过在单个Web应用程序WEB-INF/web.xml中配置他们 。

下面将对每个过滤器进行详细说明。

*注意变量$CATALINA_BASE可以理解为tomcat的路径

AddDefaultCharsetFilter

说明

HTTP规范指出,如果没有指定"text"(文本)的字符集那么它将默认使用ISO-8859-1字符集。 然而浏览器可能试图自动检测字符集。

这可能被攻击者利用来进行XSS攻击。IE浏览器已经默认这种行为。其他浏览器有一个选项来启用它。

该过滤器将强制使用用户设置的字符集来阻止浏览器的的字符集检测,从而防止XSS攻击。

Filter Class Name

org.apache.catalina.filters.AddDefaultCharsetFilter

初始化参数

参数 说明
encoding 如果没有明确的设置一个Servlet的字符集,应设置它。此参数有两个特殊值default和system。system使用JVM默认字符集,default将使用ISO-8859-1。

CorsFilter

介绍

该过滤器是W3C的CORS(跨域资源共享)规范的实现,这是一个跨域请求机制。

该过滤器的工作原理是将所需的Access-Control-*headers添加到HttpServletResponse。该过滤器还可以防止HTTP Response Splitting攻击。 如果请求无效或是不允许的,那么请求被拒绝,HTTP状态代码403(禁止)。这里是官方的过滤器请求处理演示图

Filter Class Name

org.apache.catalina.filters.CorsFilter

下面是该过滤器所需的最小的配置:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

初始化参数

参数 说明
cors.allowed.origins 被允许访问的请求。*表示任何来源。 用逗号分割的白名单域名。 例如:http://www.w3.org, https://www.apache.org 默认: * (允许任何请求)。
cors.allowed.methods 被允许访问的HTTP方法,逗号分割。这些方法也将被添加到Access-Control-Allow-Methods响应头中。 例如:GET, POST 默认值:GET, POST, HEAD, OPTIONS
cors.allowed.headers 被允许访问的请求头,逗号分割。这些头也将被添加到Access-Control-Allow-Headers响应头中。 如: Origin,Accept 默认值: Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers
cors.exposed.headers 浏览器可以访问的请求头。这些头也将被添加到Access-Control-Expose-Headers响应头中。例如:X-CUSTOM-HEADER-PING,X-CUSTOM-HEADER-PONG 。缺省情况:无。 非简单的头信息默认情况下不外露。
cors.preflight.maxage 秒,浏览器被允许的缓存结果。将会暴露在Access-Control-Max-Age响应头中。负值将阻止CORS过滤添加这个响应头。 默认:1800
cors.support.credentials 一个标志,标示是否支持用户凭据。将会暴露在Access-Control-Allow-Credentials响应头中。它有助于浏览器判断是否实际请求可以使用证书进行 默认:true
cors.request.decorate 标示是否CORS特定的属性应该添加到HttpServletRequest对象。默认值:true

一个完整的例子:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

CORSFilter 和 HttpServletRequest attributes

CORSFilter添加请求有关信息在HttpServletRequest对象中。如果cors.request.decorate初始化参数为true :

  • cors.isCorsRequest: 标示是否CORS请求.
  • cors.request.origin: The Origin URL, i.e. the URL of the page from where the request originated.
  • cors.request.type: CORS请求类型。可能的值:
  1. SIMPLE: A request which is not preceded by a pre-flight request.
  2. ACTUAL: A request which is preceded by a pre-flight request.
  3. PRE_FLIGHT: A pre-flight request.
  4. NOT_CORS: A normal same-origin request.
  5. INVALID_CORS: A cross-origin request, which is invalid.
  • cors.request.headers: Request headers sent as Access-Control-Request-Headers header, for a pre-flight request.

CsrfPreventionFilter

说明

该过滤器提供了一个Web应用程序的基本保障。假定它被映射到/*和所有的URL返回给客户机经由调用编码HttpServletResponse#encodeRedirectURL(String)或HttpServletResponse#encodeURL(String) 。

该过滤器通过产生一个随机数并将其存储在会话中,防止CSRF攻击。URL也编码有相同的随机数。 当接收到下一个请求中的请求的随机数进行比较,以在会话随机数且仅当它们是相同的是允许继续请求。

Filter Class Name

org.apache.catalina.filters.CsrfPreventionFilter

初始化参数

参数 说明
denyStatus 请求被拒绝时使用HTTP响应状态代码。默认值是403。
entryPoints 一个逗号隔开不会为一个有效的随机数的存在测试的URL列表。 它们被用来提供一种具有导航离开后导航回到受保护的应用程序。 入口点将被限制为HTTP GET请求,并且不应触发任何安全敏感操作。
nonceCacheSize 将被缓存在一个LRU基础以支持并行请求,有限使用的刷新和背面在浏览器和类似的行为可能导致在提交之前的临时值,而不是当前的先前发出随机数的数量。 如果未设置,5缺省值将被使用。
randomClass 使用类的名称来生成随机数。这个类必须是一个实例java.util.Random。如果未设置,默认值java.security

ExpiresFilter

可采用高性能的nginx来替换tomcat的实现。若感兴趣可以参考原文!

FailedRequestFilter

介绍

该过滤器触发参数解析的请求和拒绝的请求,如果一些参数,因为分析错误或请求大小限制(如参数解析过程中跳过maxParameterCount的属性连接器 )。 此过滤器可用于确保提交的客户none参数值都将丢失。

需要注意的是参数解析可能会占用一个HTTP请求的主体,因此,如果此过滤器保护的servlet使用需要谨慎request.getInputStream()或request.getReader()的调用。 一般通过将该过滤器断裂的Web应用程序的风险是不那么高,因为参数解析时消耗请求体之前检查请求的内容类型。

请注意,对于POST请求被正确解析,一个SetCharacterEncodingFilter滤波器必须高于这一配置。 见的characterEncoding页中的常见问题的详细信息。

该请求被拒绝,HTTP状态代码400(错误请求)。

Filter Class Name

org.apache.catalina.filters.FailedRequestFilter

HttpHeaderSecurityFilter

介绍

有一个数字,可以被添加到所述响应,以改善连接的安全性的HTTP标头。 该过滤器提供了一种机制,将这些头。 注意有更多要求的是安全性相关的头,像CORS,被implemted作为单独的过滤器。

Filter Class Name

org.apache.catalina.filters.HttpHeaderSecurityFilter

初始化参数

参数 说明
hstsEnabled 将一个HTTP严格传输安全(HSTS)头( Strict-Transport-Security )来对安全请求的响应集。任何HSTS头已经存在将被替换。 请参见RFC 6797的HSTS的进一步细节。如果没有指定,默认值为true
hstsMaxAgeSeconds 应该在HSTS头中使用的最大年龄值。负值将被视为零。如果未指定,默认值0
hstsIncludeSubDomains 应的includeSubDomains参数被包括在HSTS头。如果未指定,默认值false
antiClickJackingEnabled 如果反点击顶头部( X-Frame-Options )的响应进行设置。任何反点击顶头部已经存在将被替换。如果没有指定,默认值为true
antiClickJackingOption 必须是一个DENY,SAMEORIGIN ,ALLOW-FROM(不区分大小写)。如果未指定,默认值DENY
antiClickJackingUri 如果将允许-FROM用于antiClickJackingOption,什么URI应该被允许? 如果未指定,默认值一个空字符串
blockContentTypeSniffingEnabled 要阻止的内容类型嗅探(头X-Content-Type-Options )对每个响应进行设置。 如果已经存在,则报头将被替换。 如果没有指定,默认值为true

RemoteAddrFilter

远程地址过滤器,不过多解释,可采用高性能的nginx来替换tomcat的实现。若感兴趣可以参考原文!

RemoteHostFilter

远程host过滤器,不过多解释,可采用高性能的nginx来替换tomcat的实现。若感兴趣可以参考原文!

RemoteIpFilter

远程IP过滤器,不过多解释,可采用高性能的nginx来替换tomcat的实现。若感兴趣可以参考原文!

RequestDumperFilter

介绍

该过滤器从请求和响应中获取详细信息,目的是方便调试。

警告:使用此过滤器有副作用这个过滤器输出包括请求的任何参数。该参数将使用默认的平台编码进行解码。任何后续调用request.setCharacterEncoding()在Web应用程序中不会有任何效果。

Filter Class Name

org.apache.catalina.filters.RequestDumperFilter

简单的配置

可以在程序的web.xml中或者tomcat的$CATALINA_BASE/conf/web.xml中配置它。

<filter>
    <filter-name>requestdumper</filter-name>
    <filter-class>
        org.apache.catalina.filters.RequestDumperFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>requestdumper</filter-name>
    <url-pattern>*</url-pattern>
</filter-mapping>

在tomcat`$CATALINA_BASE/conf/logging.properties中添加一个专用的日志记录

# To this configuration below, 1request-dumper.org.apache.juli.FileHandler
# also needs to be added to the handlers property near the top of the file
1request-dumper.org.apache.juli.FileHandler.level = INFO
1request-dumper.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1request-dumper.org.apache.juli.FileHandler.prefix = request-dumper.
1request-dumper.org.apache.juli.FileHandler.formatter = org.apache.juli.VerbatimFormatter
org.apache.catalina.filters.RequestDumperFilter.level = INFO
org.apache.catalina.filters.RequestDumperFilter.handlers = \
  1request-dumper.org.apache.juli.FileHandler

SetCharacterEncodingFilter

介绍

用户代理不总是包含字符编码请求的信息。根据请求判断是否处理,默认ISO-8859-1并不是我们期望的。这个过滤器提供了强制设置的编码。本质上,这要求过滤器调用ServletRequest.setCharacterEncoding()方法。

该过滤器应该在POST请求解析之前被调用,因此,过滤器的顺序很重要。请注意,对于GET请求的编码此处未设置,请在页面请求中设置字符集!

Filter Class Name

org.apache.catalina.filters.SetCharacterEncodingFilter

初始化参数

参数 说明
encoding 字符集
ignore 确定由用户代理指定的任何字符编码是否被忽略。如果为true,由用户代理提供的任何值将被忽略。如果假的,编码是唯一设置,如果用户代理没有指定的编码。默认值是false

WebdavFixFilter

介绍

微软操作系统有两个WebDAV客户端。一个是用于与端口80,另一个用于所有其他端口。试图与Tomcat的WebDAV的Servlet来交流的时候用端口80用于实现不坚持WebDAV规范和失败。该过滤器为此提供了一个修复通过强制使用WebDAV实现,通过端口80的连接。

Filter Class Name

org.apache.catalina.filters.WebdavFixFilter

*注意:tomcat版本Version 7.0.63

原文地址:https://tomcat.apache.org/tomcat-7.0-doc/config/filter.html


(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容