栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > 服务器

详解Tomcat常用的过滤器

服务器 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解Tomcat常用的过滤器

目录
  • 一、跨域过滤器CorsFilter
    • 1.1、配置示例
    • 1.2、参数说明
  • 二、CSRF保护过滤器CsrfPreventionFilter
    • 2.1、配置示例
    • 2.2、参数说明
  • 三、防止参数丢失过滤器FailedRequestFilter
    • 四、获取客户端IP过滤器RemoteAddrFilter
      • 4.1、配置示例
      • 4.2、参数说明  
    • 五、获取客户端Host过滤器RemoteHostFilter
      • 六、获取原始客户端IP过滤器RemoteIpFilter
        • 6.1、如何获得原始的客户端的IP地址
        • 6.2、配置示例
      • 七、字符集编码过滤器SetCharacterEncodingFilter
        • 7.1、配置示例
        • 7.2、参数说明  

      一、跨域过滤器CorsFilter

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

      1.1、配置示例
      
        CorsFilter
        org.apache.catalina.filters.CorsFilter
        
          cors.allowed.origins
          *
        
        
          cors.allowed.methods
          GET,POST,HEAD,OPTIONS,PUT
        
        
          cors.allowed.headers
          Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers
        
        
          cors.exposed.headers
          Access-Control-Allow-Origin,Access-Control-Allow-Credentials
        
        
          cors.support.credentials
          true
        
        
          cors.preflight.maxage
          10
        
      
      
        CorsFilter
        /*
      

      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、配置示例
      
          CsrfPreventionFilter
          org.apache.catalina.filters.CsrfPreventionFilter
          
       denyStatus
       403
          
          
       entryPoints
       /html,/html/list
          
          
       nonceCacheSize
       5
          
      
      
          CsrfPreventionFilter
          /*
      

      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、配置示例
      
          Remote Address Filter
          org.apache.catalina.filters.RemoteAddrFilter
          
          allow
          127.d+.d+.d+|::1|0:0:0:0:0:0:0:1
          
      
      
          Remote Address Filter
          /*
      

      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头的配置

      
          RemoteIpFilter
          org.apache.catalina.filters.RemoteIpFilter
      
      
      
          RemoteIpFilter
          /*
          REQUEST
      

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

      
          RemoteIpFilter
          org.apache.catalina.filters.RemoteIpFilter
          
          protocolHeader
          x-forwarded-proto
          
      
      
      
          RemoteIpFilter
          /*
          REQUEST
      

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

      
          RemoteIpFilter
          org.apache.catalina.filters.RemoteIpFilter
          
       allowedInternalProxies
       192.168.0.10|192.168.0.11
          
          
       remoteIpHeader
       x-forwarded-for
          
          
       remoteIpProxiesHeader
       x-forwarded-by
          
          
       protocolHeader
       x-forwarded-proto
          
      

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

      
          RemoteIpFilter
          org.apache.catalina.filters.RemoteIpFilter
          
       allowedInternalProxies
       192.168.0.10|192.168.0.11
          
          
       remoteIpHeader
       x-forwarded-for
          
          
       remoteIpProxiesHeader
       x-forwarded-by
          
          
       trustedProxies
       proxy1|proxy2
          
      

      七、字符集编码过滤器SetCharacterEncodingFilter

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

      7.1、配置示例
      
          SetCharacterEncodingFilter
          org.apache.catalina.filters.SetCharacterEncodingFilter
          
       encoding
       UTF-8
          
          
       ignore
       false
          
      
      
          SetCharacterEncodingFilter
          /*
      

      7.2、参数说明  

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

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

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

      转载请注明:文章转载自 www.mshxw.com
      本文地址:https://www.mshxw.com/it/304877.html
      我们一直用心在做
      关于我们 文章归档 网站地图 联系我们

      版权所有 (c)2021-2022 MSHXW.COM

      ICP备案号:晋ICP备2021003244-6号