文档章节

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

如梦技术
 如梦技术
发布于 2015/08/03 21:22
字数 2527
阅读 526
收藏 3

介绍

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

© 著作权归作者所有

如梦技术

如梦技术

粉丝 345
博文 49
码字总数 23099
作品 6
朝阳
后端工程师
私信 提问
Tomcat源码深析之web.xml组件的处理

这篇文章主要是带着读者通过分析Tomcat的源码,深入了解Tomcat对web.xml配置的组件的的处理,文章内容主要包括Tomcat对上下文参数(contextParams),过滤器(Filters),应用监听器(listene...

Float_Luuu
2016/01/01
1K
0
JavaWeb系列:Servlet

Servlet简介   Servlet是Java Web的技术核心之一,而且也是另一技术核心Java Server Pages(JPS)的支撑基础。文章的主要部分将介绍Servlet的使用以及原理,还有Servlet的载体,这里选用T...

shptc
2017/06/23
0
0
(七)Servlet过滤器

Servlet过滤器简介 过滤器通过Web部署描述符(web.xml)中XML标签来声明,这样就可以允许添加和删除过滤器而无需改动如何应用代码或JSP页面。 它能够对Servlet容器的请求和响应对象进行检查和...

iborder
2016/09/05
3
0
熵增学院-Anders-剑走偏锋,了解Spring Boot内部Servlet容器

还记得大明湖畔的servlet吗?其实Spring Boot支持内嵌的Tomcat, Jetty和Undertow服务器,多数开发者只需要使用合适的'Starter'来获取一个完全配置好的实例即可,内嵌服务器默认监听8080端口的...

melon_jj
2018/11/09
0
0
Tomcat 搭建spring mvc 项目报错?

严重: Exception sending context initialized event to listener instance of class com.ahut.library.modules.sys.listener.WebContextListener org.springframework.beans.factory.BeanCr......

我爱编程zc
2016/12/03
364
1

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu或ubuntu kylin优麒麟中安装QQ、wechat微信、百度网盘

从中国国内的地址下载deepin wine,码云上的。这样网速比较快。然后,按照说明向下安装。 https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu...

gugudu
35分钟前
2
0
基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
55分钟前
14
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
58分钟前
2
0
MySQL mybatis Point类型数据

MySQL中的point用于表示GIS中的地理坐标,在GIS中广泛使用 如何写入mysql,如下图: CREATE TABLE `test-point` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号', `point` ......

张欢19933
今天
3
0
设计模式-适配器模式

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入...

HOT_POT
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部