tomcat-web应用过滤器

WEB应用过滤器

对于web应用中我们可以配置自定义的过滤器满足自己对项目的需求,但是针对一些常见的Web应用需求,Tomcat已经提供了一系列的实现,只需要直接配置加入到项目中就可以满足需要。

CorsFilter

Org.apache.catalina.filters.CorsFilter是W3C CORS(跨域资源共享)规范的一个实现,是启用跨域资源共享的一种途径。该过滤器主要在HttpServletResponse中增加Access-Control-*头,同时保护HTTP响应避免拆分。如果请求无效或者禁止访问,将返回403响应码。

CorsFilter支持以下初始化参数

Cors.allowed.origins:允许访问资源的域列表。“*”表示允许访问来自任何域的资源。多个域以“,”分隔。默认为“*”。

Cors.allowed.methods:可以用于访问资源的HTTP方法列表。以“,”分隔,用于跨域请求。这些方法将作为Preflight响应头Access-Control-Allow-Methods的一部分。默认为“GET,POST,HEAD,OPTIONS”。

Cors.allowed.headers:当构造实际请求时可以使用的请求头,以“,”分隔。这些头也作为Preflight响应头Access-Control-Allow-Headers的一部分。默认为“Orgin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers”。

Cors.exposed.headers:浏览器允许访问的头信息列表,以“,”分隔。这些头也作为Preflight响应头Access-Control-Allow-Headers的一部分。默认为空。

Cors.preflight.maxage:浏览器允许缓存Preflight请求结果的时间,单位为秒。该参数将作为Preflight响应头Access-Control-Max-Age的一部分。负数时,CorsFilters将不添加头到Preflight响应。默认是1800。

Cors.support.credentials:表示资源是否支持用户证书。该参数将作为Preflight响应头Access-Control-Allow-Credentials的一部分。他将帮助浏览器确定是否可以使用证书构造实际请求。默认为true。

Cors.request.decorate:Cors规范属于是否应添加到HttpServletRequest,默认为true。CorsFilter为HttpServletRequest添加了相关信息,用于下游消费。如果cors.request.decorate配置为true,下列属性将会被添加。

         Cors.isCorsRequest:用于确定请求是否为Cors请求。

         Cors.request.origin:源URL,请求源自的页面URL。

         Cors.request.type:Cors请求类型,可能值如下。

                   SIMPLE:非Preflight请求为先导的请求。

                   ACTUAL:以Preflight请求为先导的请求。

                   PRE_FLIGHT:Preflight请求。

                   NOT_CORS:正常的同域请求。

                   INVALID_CORS:无效的跨域请求。

Cors.request.headers:作为Preflight请求Access-Control-Request-Headers头发送的请求头信息。

<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</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
    </init-param>
    <init-param>
        <param-name>cors.support.crednetials</param-name>
        <param-value>true</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.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>

CsrfPreventionFilter

         Org.apache.catalina.filters.CsrfPreventionFilter为Web应用提供了基本的CSRF保护。该过滤器假定其映射为“/*”,返回客户端的所有链接均通过HttpServletResponse.encodeRedirectURL(String)和HttpServletResponse.encodeURL(String)编码。

         该Filter通过生成一个随机数并存储到会话中来阻止CSRF,URL使用该随机数进行编码。当接收到下一个请求时,请求中随机数与会话中的进行比较,只有两者相同时,请求才允许。

CsrfPreventionFilter支持以下初始化参数

DenyStatus:HTTP响应码,用于驳回拒绝请求。默认为403。

EntryPoints:以“,”分隔的URL列表,这些URL将不会进行随机数检测。这主要用于在通过导航离开受保护应用时,可再通过导航的形式返回。

NonceCacheSize:随机数缓存大小。先前发布的随机数将被缓存到一个URL缓存中以支持并发请求/有限的用于浏览器刷新和返回以及一些类似的行为。默认为5。

RandomClass:用于生成随机数的类名,必须是java.util.Random的实例。如不设置,默认为java.security.SecureRandom。

ExpiresFilter

         Org.apache.catalina.filters.ExpiresFilter是Java ServletAPI当中的一部分,它复制控制设置服务器响应中的Expires头和Cache-Control头的max-age。过期时间可以设置为相对于源文件最后修改时间或者浏览器的访问时间。

         如果请求的数据在缓存中存在,那么将从本地缓存中获取,而不是访问实际的资源服务器,直到超过失效时间。超过失效时间后,缓存副本将被视为过期,浏览器将会重新从服务器获取副本。

ExpiresFilter支持以下初始化参数

ExpiresExcludedResponseStatusCodes:用于指定ExpiresFilter不会生成expiration头信息的的HTTP,多个以“,”分隔。默认情况下,响应码304将跳过。

ExpiresByType<Content-type>:用于为<content-type>指定的文档类型生成Expires和Cache-Contorl:max-age的值(如text/html)。Tomcat采用的定义格式为:<base>[plus]{<num><type>}*。

         <base>取值如下:

                   Access:表示基于客户端访问时间计算过期时间。

                   Now:与access相同。

                   Modification:表示基于文件上次修改时间计算过期时间。

         当使用modification时,如果响应内容并非来源于硬盘中的文件,并不会添加Expires响应头。如果使用access,每个客户端的过期时间均不相同;而使用modification,缓存中当前文档所有副本的过期时间是相同的。

         [plus]关键字可选,<num>为整数值。

         <type>取值如下。

                   Year/years;month/months;week/weeks;day/days;hour/hours;minute/minutes;second/seconds;”<num><type>“可以添加多个。

ExpiresDefault:用于指定所有文档类型过期时间的默认计算算法,可以通过ExpiresByType覆盖。ExpiresByType设定优先与ExpiresDefault的配置设置的Expires和Cache-Control:max-age的值。配置格式和ExpiresByType相同。

         只有当满足以下条件时,ExpiresFilter才会为响应设置expiration头信息。1)Servlet未添加expiration头信息。2)响应码未包含到ExpiresExcludedResponseStatusCodes中。3)响应的Content-Type存在匹配的ExpiresByType<content-type>配置,或者添加了ExpiresDefault配置。

         ExpiresFilter配置的优先级如下:1)首先精准匹配HttpServletResponse.getContentType()返回的文档类型,此时可能包含字符集(如application/javascript;cahrset=UTF-8)。2)其次匹配不包含字符集的文档类型(如application/javascript)。3)再次匹配文档的主类型(如application)。4)最后匹配ExpiresDefaul。

<filter>
    <filter-name>ExpiresFilter</filter-name>
    <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class>
    <init-param>
        <!--30分钟过期-->
        <param-name>ExpiresDefault</param-name>
        <param-value>access plus 30 mimutes</param-value>
    </init-param>
    <init-param>
        <!--30分钟过期-->
        <param-name>ExpiresByType text/css</param-name>
        <param-value>access plus 30 mimutes</param-value>
    </init-param>
    <init-param>
        <!--一个月15天2小时过期-->
        <param-name>ExpiresByType image</param-name>
        <param-value>access plus 1 month 15 days 2 hours</param-value>
    </init-param>
    <init-param>
        <!--演示精准文档类型配置,30分钟过期-->
        <param-name>ExpiresByType application/javascript;charset=UTF-8</param-name>
        <param-value>access plus 30 mimutes</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>ExpiresFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

FailedRequestFilter

         Org.apache.catalina.filters.FailedRequestFilter用于触发请求的参数解析,当参数解析失败时(解析异常/请求大小超过限制),将会拒绝请求。该Filter用于确保客户端提交的参数信息不会发生丢失。

         该Filter的原理是先调用ServletRequest.getParameter,然后判断属性org.apache.catalina.paraneter_parse_failed的值,如果不为空,则直接返回400。

         为了POST请求可以正确解析,需要在该Filter之前配置SetCharacterEncodingFilter过滤器。

         FailedRequestFilter不支持任何初始化参数。

RemoteAddrFilter

         Org.apache.catalina.filters.RemoteAddrFilter允许比较提交请求的客户端IP地址是否符合指定的正则表达式,以确保是否允许继续处理请求。当使用IPv6时需要注意,IP地址格式根据调用API不同而不同,如果通过Socket获取,格式为x:x:x:x:x:x:x:x。如localhost,将是0:0:0:0:0:0:0:1,而非::1。

RemoteAddrFilter支持以下初始化参数

         Allow:正在表达式,用于指定允许访问的客户端IP地址。

         Deny:正在表达式,用于指定禁止访问的客户端IP地址。

         denyStatus:拒绝请求时返回的HTTP响应码,默认为403。

<filter>
    <filter-name>RemoteAddrFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RemoteAddrFilter</filter-class>
    <init-param>
        <param-name>allow</param-name>
        <param-value>127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>RemoteAddrFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

RemoteHostFilter

Org.apache.catalina.filters.RemoteHostFilter允许比较提交请求的客户端主机是否符合指定的正则表达式,以确保是否允许继续处理请求。该Filter使用ServletRequest.getRemoteHost()方法获取主机名,因此为了使该方法返回合适的主机名,必须启用Connector上的DNS查找功能。

RemoteHostFilter支持以下初始化参数

         Allow:正在表达式,用于指定允许访问的客户端主机名。

         Deny:正在表达式,用于指定禁止访问的客户端主机名s。

         denyStatus:拒绝请求时返回的HTTP响应码,默认为403。

<filter>
    <filter-name>RemoteHostFilter</filter-name>
    <filter-class>org.apache.catalina.filters. RemoteHostFilter </filter-class>
    <init-param>
        <param-name>allow</param-name>
        <param-value>127\.\d+\.\d+\.\d+</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name> RemoteHostFilter </filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

RemoteIpFilter

         当客户端通过HTTP代理或者负载均衡访问应用服务器时,对于服务器来说,请求直接源自前置的代理服务器,那么此时获取到的远程IP实际为代理服务器的IP地址。HTTP协议通过“X-Forwarded-For“头信息记录了客户端到应用服务器前置代理的IP路径,因此可以通过该属性获知客户端的IP地址。Tomcat通过org.apache.catalina.filtersRemoteIpFilter实现了该功能。解析了参数,替换为真实请求的IP,通过ServletRequest.getRemoteAddr和ServletRequest.getRemoteHost获取相关信息。

         X-Forwarded-For的格式一般如下:X-Forwarded-For:client,proxy1,proxy2

RemoteIpFilter支持以下初始化参数

         remoteIpHeader:HTTP请求头名称,过滤器将从该请求头读取IP地址完成转换,默认为X-Forwarded-For

         internalProxies:IP地址的正则表达式,代理服务器IP地址匹配该表达式时将视为内部代理。

         proxiesHeader:HTTP请求头名称,用于保存当前过滤器处理的remoteIpHeader中记录的代理服务器列表。默认为X-Forwarded-By

         requestAttributesEnabled:如果为true,过滤器将使用转换后的值覆盖AccessLog中使用的相关请求属性(IP地址,主机,端口号,协议)。默认为true.

         trustedProxies:正则表达式,如果代理服务器的IP地址匹配该表达式,那么将被视为可信任代理。remoteIpHeader中记录的可信任代理将会被包含到proxiesHeader中,如果不指定所有代理均不被信任。

         protocolHeader:HTTP请求头名称,用于记录客户端链接代理所使用的协议。默认为空

         portHeader:HTTP请求头名称,用于记录客户端链接代理所使用的端口。默认为空。

         protocolHeaderHttpsValue:当protocolHeader对应请求头的取值等于该属性值时,tomcat将请求类型视为HTTPS。默认为https

         httpServerPort:当protocolHeader对应请求头表明是HTTPS请求,但是portHeader对应请求头没有设置时,ServletRequest.getServerPort的返回值。默认为443

         changeLocalPort:如果为true,portHeader对应请求头保存的端口号将会覆盖Servlet-Request.getLocalPort()的返回值。默认为false

RequestDumperFilter

         Org.apache.catalina.filter.RequestDumperFilter以日志形式输出请求和响应对象内容,主要用于调试。当使用该过滤器的时候,推荐将日志输出到单独文件,并使用org.apacahe.juli.VerbatimFormmater格式化。

         使用该过滤器的副作用在于:由于输出了所有请求的参数,并且参数使用默认的平台编码进行解码,因此后续调用request.SetCharacterEncoding()将无效。

         该过滤器不需要配置任何初始化参数,与其对应的日志配置建议如下:

1request-dumper.org.apache.juli.FileHandler.level = INFOv

1request-dumper.org.apache.juli.FileHandler.directorym = ${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编码。Org.apache.catalina.filters.SetCharacterEncodingFilter提供了一种设置字符编码的方式。

SetCharacterEncodingFilter支持以下初始化参数

         Encoding:指定的字符集编码。

         Ignore:布尔值,用于表示是否忽略客户端请求设置的字符集编码。True忽略,false当请求没有设置编码的时候设置。

WebdavFixFilter

         Windows操作系统存在两个WebDAV客户端。其中一个使用80端口,另一个用于所有其它端口。使用80端口的实现不符合WebDAV规范,当与tomcat WebDAV Servlet通信时会失败。Org.apache.catalina.filters.WebdavFixFilger用于解决上述问题,它将强制链接到80端口的WebDAV实现。该过滤器不支持任何初始化参数。

猜你喜欢

转载自blog.csdn.net/sinat_32366329/article/details/80377249
今日推荐