iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >详解Tomcat常用的过滤器
  • 707
分享到

详解Tomcat常用的过滤器

2024-04-02 19:04:59 707人浏览 独家记忆
摘要

目录一、跨域过滤器CorsFilter1.1、配置示例1.2、参数说明二、CSRF保护过滤器CsrfPreventionFilter2.1、配置示例2.2、参数说明三、防止参数丢失过

一、跨域过滤器CorsFilter

org.apcache.catalina.filters.CorsFilter是跨域资源共享规范的一个实现,常常用于前后端分离,静态资源与后端分离等情况。它主要在httpservletResponse中增加Access-Control-*头,同时保护Http响应避免拆分,如果请求无效或者禁止访问,则返回403响应码。

1.1、配置示例


<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>

1.2、参数说明

1、cors.allowed.origins

允许访问的跨域资源列表,"*"表示允许访问来自任何域的资源,多个域用逗号分隔,默认为"*"

2、cors.allowed.methods

可以用于访问资源的HTTP方法列表,","分隔,用于跨域请求。这些方法将出现在Prefligh(预检请求)响应头Access-Control-Allow-Methods的一部分,t默认为"GET, POST, HEAD, OPTIONS"

3、cors.allowed.headers

构造请求时可以使用的请求头,以","分隔,这些方法将出现在Prefligh(预检请求)响应头Access-Control-Allow-Headers的一部分,默认为Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers

4、cors.exposed.headers

浏览器允许访问的头部信息列表,","分隔。这些方法将出现在Prefligh(预检请求)响应头Access-Control-Allow-Headers的一部分,默认为空。

5、cors.preflight.maxage

浏览器允许缓存的Preflght请求结果的时间,单位为秒。如果为负数,则表示CorsFilter不会添加头到Preflight响应,这些方法将出现在Prefligh(预检请求)响应头Access-Control-Max-Age的一部分,默认为1800.

6、cors.support.credentials

表示资源是否支持用户证书,这些方法将出现在Prefligh(预检请求)响应头Access-Control-Allow-Credentials的一部分,默认为true

7、cors.request.decorate

Cors规范属性是否已经添加到HttpServletRequest,默认为true。CorsFiter会为HttpServletRequest添加请求相关信息,cors.request.decorate配置为true,那么以下属性将会被添加

1)cors.isCorsRequest:用于请求是否为Cors请求。

2)cors.request.origin:源URL,请求源自的页面URL。

3)cors.request.type:Cors的请求类型,如下:

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

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

PRE_FLIGHT:Preflight请求

NOT_CORS:正常同域请求

INVALID_CORS:无效的域请求

4)cors.request.headers:作为Preflight请求Access-Control-Request-Header头发送的请求头信息。

二、CSRF保护过滤器CsrfPreventionFilter

org.apcache.catalina.filters.CsrfPreventionFilter为WEB应用提供了基本的CSRF保护。返回的客户端的所有链接均通过HttpServletResponse.encodeRedirectURL(String)与HttpServletResponse.encodeURL(String)进行编码,该过滤器生成一个随机数并存储到会话session中进行对比,URL使用该随机数进行编码。当接收到下一个请求时,请求中随机数与会话中的进行对比,只有两者相同时,请求才会被允许。

2.1、配置示例


<filter>
    <filter-name>CsrfPreventionFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CsrfPreventionFilter</filter-class>
    <init-param>
        <param-name>denyStatus</param-name>
        <param-value>403</param-value>
    </init-param>
    <init-param>
        <param-name>entryPoints</param-name>
        <param-value>/html,/html/list</param-value>
    </init-param>
    <init-param>
        <param-name>nonceCacheSize</param-name>
        <param-value>5</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CsrfPreventionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

2.2、参数说明

1、denyStatus:HTTP响应吗,用于驳回拒绝请求,默认为403  

2、entryPoints:以","为分隔的URL列表,这些列表将不会进行随机数检测(主要用于通过导航离开受保护应用,之后再返回) 


if ("GET".equals(req.getMethod()) && this.entryPoints.contains(this.getRequestedPath(req))) {
                skipNonceCheck = true;
 }

3、nonceCacheSize:随机数缓存大小。先前发布的随机数被缓存到一个LRU缓存中以支持并发请求,有限的用于浏览器刷新等行为(可能导致随机数不是当前的),默认为5


private int nonceCacheSize = 5;
....
if (nonceCache == null) {
    nonceCache = new CsrfPreventionFilter.LruCache(this.nonceCacheSize);
      if (session == null) {
           session = req.getSession(true);
       }

    session.setAttribute("org.apache.catalina.filters.CSRF_NONCE", nonceCache);
}

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

三、防止参数丢失过滤器FailedRequestFilter

org.apcache.catalina.filters.FailedRequestFilter用于触发请求的参数解析,当参数解析失败时,将会拒绝请求,该Filter用于确保客户端提交的参数信息不发生丢失。该过滤器的原理是:先调用ServletRequest.getParameter(首次调用会触发Tomcat服务器的请求参数解析,如果参数解析失败,将结果放到请求属性org.apache.catalina.parameter_parse_failed中),之后判断属性org.apache.catalina.parameter_parse_failed的值,如果不为空则直接返回400。

为了能正确解析参数,需要该Filter之前设置字符集编码过滤器SetCharacterEncodingFilter。此外,该过滤器是不支持r初始化参数的


// 判断是否为有效的请求:org.apache.catalina.parameter_parse_failed为null
private boolean isGoodRequest(ServletRequest request) {
    request.getParameter("none");
    return request.getAttribute("org.apache.catalina.parameter_parse_failed") == null;
}

四、获取客户端IP过滤器RemoteAddrFilter

org.apcache.catalina.filters.RemoteAddrFiler允许比较提交的客户端IP地址(通过ServletRequest.getRemoteAddr获取)是否符合指定正则表达式

4.1、配置示例


<filter>
    <filter-name>Remote Address Filter</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>Remote Address Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

4.2、参数说明  

1、allow:指定允许访问的客户端IP地址  

2、deny:拒绝访问的客户端地址  

3、denyStatus:拒绝请求时返回的HTTP响应吗。

五、获取客户端Host过滤器RemoteHostFilter

org.apcache.catalina.filters.RemoteHostFiler允许比较提交请求的客户端主机名是否符合指定的正则表达式,以确定是否允许继续处理请求。参数同RemoteAddrFilter

六、获取原始客户端IP过滤器RemoteIpFilter

 当客户端通过HTTP代理或者负载均衡访问服务器时,对于服务器来说,请求直接源自前置的代理服务器,此时获取到的远程IP实际为代理服务器的IP地址。

6.1、如何获得原始的客户端的IP地址

HTTP协议通过X-Forwarded-For头信息记录了资客户端到应用服务器前置代理的IP地址,RemoteIpFilter通过解析该请求头,将请求中的IP地址与主机名替换为客户端真实的IP地址和主机信息,此外还可以通过X-Forwardred-Proto请求头替换当前的协议名称http/https、服务器端口及request.secure。

X-Forwarded-For的格式如下:

X-Forwarded-For: client, proxy1, proxy2

最左侧client为最原始的客户端IP,如上示例中客户端经过了proxy1、proxy2、proxy3三级代理(最后一层proxy3不显示,通过ServletRquest.getRemoteAddr获取)。在负载均衡的情况下,RemoteAddrFilter和RemoteHostFilter需要与该过滤器配合使用,否则无法正确限制访问客户端。

通常我们获取X-Forwarded-For使用如下Java代码:


public static String getIp(HttpServletRequest request) {
    String requestAddr = request.getHeader("x-forwarded-for");
    if (requestAddr == null || requestAddr.length() == 0 || "unknown".equalsIgnoreCase(requestAddr)) {
        requestAddr = request.getHeader("Proxy-Client-IP");
    }

    if (requestAddr == null || requestAddr.length() == 0 || "unknown".equalsIgnoreCase(requestAddr)) {
        requestAddr = request.getHeader("WL-Proxy-Client-IP");
    }

    if (requestAddr == null || requestAddr.length() == 0 || "unknown".equalsIgnoreCase(requestAddr)) {
        requestAddr = request.getRemoteAddr();
    }

    return requestAddr;
}

6.2、配置示例

1)基本处理X-Forwarded-For头的配置


<filter>
    <filter-name>RemoteIpFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>RemoteIpFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

2)处理X-Forwarded-For与x-forwarded-proto头部的配置


<filter>
    <filter-name>RemoteIpFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
    <init-param>
    <param-name>protocolHeader</param-name>
    <param-value>x-forwarded-proto</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>RemoteIpFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

3)使用内部代理的高级配置


<filter>
    <filter-name>RemoteIpFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
    <init-param>
        <param-name>allowedInternalProxies</param-name>
        <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
    </init-param>
    <init-param>
        <param-name>remoteIpHeader</param-name>
        <param-value>x-forwarded-for</param-value>
    </init-param>
    <init-param>
        <param-name>remoteIpProxiesHeader</param-name>
        <param-value>x-forwarded-by</param-value>
    </init-param>
    <init-param>
        <param-name>protocolHeader</param-name>
        <param-value>x-forwarded-proto</param-value>
    </init-param>
</filter>

4)使用可信任代理高级配置


<filter>
    <filter-name>RemoteIpFilter</filter-name>
    <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
    <init-param>
        <param-name>allowedInternalProxies</param-name>
        <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
    </init-param>
    <init-param>
        <param-name>remoteIpHeader</param-name>
        <param-value>x-forwarded-for</param-value>
    </init-param>
    <init-param>
        <param-name>remoteIpProxiesHeader</param-name>
        <param-value>x-forwarded-by</param-value>
    </init-param>
    <init-param>
        <param-name>trustedProxies</param-name>
        <param-value>proxy1|proxy2</param-value>
    </init-param>
</filter>

七、字符集编码过滤器SetCharacterEncodingFilter

提供了一种设置字符集编码的方式,通常情况下默认ISO-8859-1编码,但实际生产环境推荐使用UTF-8编码,而请求中的编码可以在未指定编码时使用,也可以强制覆盖。

7.1、配置示例


<filter>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>ignore</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SetCharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

7.2、参数说明  

1、encoding:指定的字符集编码    

2、ignore:表示是否忽略客户端请求设置的字符集编码,如果为true那么都会将请求字符集编码覆盖,如果为false,请求没有指定字符集编码时设置。默认为false

以上就是详解Tomcat常用的过滤器的详细内容,更多关于Tomcat过滤器的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Tomcat常用的过滤器

本文链接: https://www.lsjlt.com/news/129208.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Tomcat常用的过滤器
    目录一、跨域过滤器CorsFilter1.1、配置示例1.2、参数说明二、CSRF保护过滤器CsrfPreventionFilter2.1、配置示例2.2、参数说明三、防止参数丢失过...
    99+
    2022-11-12
  • tomcat启动过滤器异常如何解决
    要解决Tomcat启动过滤器异常,可以按照以下步骤进行操作:1. 检查过滤器配置:检查web.xml文件中的过滤器配置是否正确。确保...
    99+
    2023-09-14
    tomcat
  • tomcat启动过滤器异常怎么解决
    如果Tomcat启动时出现过滤器异常,可以尝试以下几种解决方法:1. 检查过滤器配置:查看web.xml文件或者注解配置,确认过滤器...
    99+
    2023-08-19
    tomcat
  • Django零基础入门之常用过滤器详解
    引言: 前面讲过了Django中使用模板变量。使用很简单,那么有没有什么关于模板变量的骚操作呢? 答案是肯定有的,这就是本文要讲的——过滤器! 1.过滤器 (1)纯干货讲解: 作用:...
    99+
    2022-11-12
  • JavaFile类常用方法与文件过滤器详解
    目录File类File类常用的构造方法查看文件的相应信息遍历目录下的文件文件过滤器对子目录进行遍历删除文件及目录File类 File类用于封装一个路径,这个路径可以是从系统盘符开始的...
    99+
    2022-11-13
  • Java过滤器Filter详解
    目录Filter学习Filter功能Filter的工作原理多个Filter的实现Filter的执行逻辑总结Filter学习 Filter功能 拦截jsp、静态图片文件、静态html资源文件 实现URL级别的权限访问控制 ...
    99+
    2019-04-25
    Java过滤器 Filter
  • Vue之过滤器详解
    <body> <div id="root"> <h2>显示格式化后的时间</h2> &l...
    99+
    2022-11-12
  • Java Web过滤器详解
    过滤器是什么玩意?所谓过滤器,其实就是一个服务端组件,用来截取用户端的请求与响应信息。过滤器的应用场景:1.对用户请求进行统一认证,保证不会出现用户账户安全性问题编码转换,可在服务端的过滤器中设置统一的编码格式,避免出现乱码对用户发送的数据...
    99+
    2023-05-31
    java web 过滤器
  • springboot中使用过滤器,jsoup过滤XSS脚本详解
    目录springboot使用过滤器,jsoup过滤XSS脚本1.把可能包含脚本的参数位置分析一下2.分析实现过程3.代码实现过程使用jsoup防止XSS攻击springboot使用过...
    99+
    2022-11-12
  • 详解JavaWeb中的过滤器Filter
    目录一、什么是过滤器1.1 使用步骤二、初体验2.1 mynav.html2.2 FilterServlet程序2.3 HelloServlet程序2.4 web.xml2.5 in...
    99+
    2022-11-12
  • Vue中的过滤器(filter)详解
    目录过滤器使用位置全局过滤器、局部过滤器 全局过滤器:局部过滤器:过滤器中传入多个参数:多个过滤器串联:官方文档:https://cn.vuejs.org/v2/guide...
    99+
    2022-11-13
    Vue中的过滤器 Vue filter过滤器 vue filter
  • 网关Gateway过滤器的使用详解
    目录前言:全局过滤器自定义全局过滤器跨域问题前言: 最近在学习微服务相关的知识,看了黑马的相关课程,将关于Gateway过滤器的知识又总结了一些,希望能帮到各位小伙儿们以及加深下自己...
    99+
    2022-11-13
  • JavaWeb中过滤器Filter的用法详解
    目录过滤器Filter处理顺序使用场景自定义过滤器源码分析FilterDefFilterMap初始化过滤器创建过滤器链 ApplicationFilterChain执行过滤器链过滤器...
    99+
    2022-11-13
    JavaWeb 过滤器 JavaWeb Filter JavaWeb 过滤器Filter
  • 详解Servlet之过滤器(Filter)
    过滤器1.为什么使用它?有很多全站性的东西需要处理,例如乱码问题,通过过滤器统一进行过滤更简单2.有什么用?实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以...
    99+
    2023-05-31
    servlet 过滤器 滤器
  • servlet过滤器(Filter)详解(九)
    本文实例为大家分享了servlet过滤器的具体代码,供大家参考,具体内容如下1.servlet过滤器产生背景  项目中我们会遇到这样一类的需求,对访问服务器的用户ip实施过滤,只有在允许名单中的ip才能访问服务,为了实现需求,每当有客户端请...
    99+
    2023-05-31
    servlet 过滤器 filter
  • Vue过滤器使用方法详解
    目录前言过滤器私有过滤器插值表达式中使用v-bind属性绑定全局过滤器前言 本篇来学习vue(仅适用vue2)中过滤器的基本用法 过滤器 过滤器(Filters)是vue为开发者提供...
    99+
    2022-12-15
    Vue过滤器的作用 Vue过滤器如何使用 Vue过滤器
  • SpringBoot过滤器实现项目内接口过滤详解
    目录业务需要处理的问题公众号用户信息与业务系统做绑定将路由中心的接口与业务系统的接口判断处理步骤全部代码代理转发实现业务 由于业务需求,存在两套项目,一套是路由中心,一套是业务系统....
    99+
    2023-05-16
    SpringBoot实现项目接口过滤 SpringBoot项目接口过滤 SpringBoot过滤器
  • 一文详解JavaWeb过滤器(Filter)
    目录基本介绍过滤器(Filter)接口使用过滤器(Filter)创建过滤器(Fliter)使用过滤器(Filter)配置过滤器(Filter)拦截路径 注解方式xml方式&...
    99+
    2023-05-19
    Java 过滤器 Java Filter
  • HBase Filter 过滤器之RowFilter详解
    前言:本文详细介绍了HBase RowFilter过滤器Java&Shell API的使用,并贴出了相关示例代码以供参考。RowFilter 基于行键进行过滤,在工作中涉及到需要通过HBase Rowkey进行数据过滤时可以考虑使...
    99+
    2017-12-16
    HBase Filter 过滤器之RowFilter详解
  • HBase Filter 过滤器之FamilyFilter详解
    前言:本文详细介绍了 HBase FamilyFilter 过滤器 Java&Shell API 的使用,并贴出了相关示例代码以供参考。FamilyFilter 基于列族进行过滤,在工作中涉及到需要通过HBase 列族进行数据过滤...
    99+
    2017-01-24
    HBase Filter 过滤器之FamilyFilter详解
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作