Tomcat 利用 RemoteIpValve 对每个request请求的处理规则

本文详细介绍了Tomcat中的RemoteIpValve组件的工作原理及其配置选项,包括remoteIpHeader、proxiesHeader、internalProxies及trustedProxies等属性的作用与处理流程。

org.apache.catalina.valves.RemoteIpValve的属性

1、 remoteIpHeader

声明HEADER的key值,对应key的存储value值为从请求客户端开始经过的所有IP地址列表(IP间以英文逗号分隔)。

2、proxiesHeader

声明HEADER的key值,对应key的存储value值为从请求客户端开始经过的内部代理的IP地址列表(IP间以英文逗号分隔)。经过tomcat时,由tomcat根据remoteIpHeader、、对HEADER进行复制。不保证包括所有内部代理的IP列表

3、 internalProxies

声明了内部代理的IP地址匹配正则表达式。request.getHeader(remoteIpHeader)的IP列表中,只有不匹配了该正则式的IP才有可能写入request.getHeader(proxiesHeader)中

4、trustedProxies

声明了可信代理的IP地址匹配正则表达式。request.getHeader(remoteIpHeader)的IP列表中,如果非内部代理、但是可信代理的IP,则有可能写入request.getHeader(proxiesHeader)中(不匹配internalProxies,匹配trustedProxies)

tomcat利用RemoteIpValve对请求头内容的处理内容

可见org.apache.catalina.valves.RemoteIpValve#invoke

  • 1、获取request中的所需信息,调用 request.getRemoteAddr() 获取 request.getHeader(remoteIpHeader) 的值;

作为初始值,最后需要还原回 request 中;在回传给前端用户前,恢复对request的修改。

  • 2、对 remoteAddr 按“,” 切割字符串,得到 IP地址数值;
  • 3、对 IP地址数值进行遍历,总最后一个IP开始(String中位于最右的IP),对每个IP 依次(internalProxies、trustedProxies)进行正则表达式匹配:
    • 3.1、不匹配 internalProxies 的直接跳过,对数组中下一个IP进行匹配。否则进行3.2;
    • 3.2、匹配 trustedProxies 的暂存在 proxiesHeaderValue 数组中。否则进行3.3;
    • 3.3、对于既不是内部代理、又不是可信代理的IP地址,则作为新request.getRemoteAddr()的值。结束循环,不再进行匹配操作。
  • 4、更新request
    • 4.1、将第三步中得到的代理IP地址数组写入到request.getHeader(proxiesHeader)中(若数组长度为0,则为null)
      —— 由此可见,经历过上述处理的request请求,request.getHeader(proxiesHeader)中代理的IP地址并不包括经过的所有代理IP地址,且有可能一个代理IP地址都没有写入。
    • 4.2、将第3步尚未做过匹配检查的IP列表重新写回到request.getHeader(remoteIpHeader)中;
  • 5、判断 request.getHeader(protocolHeader) 与protocolHeaderHttpsValue(值为“https”)是否一致:
    • 5.1、若 request.getHeader(protocolHeader) == null:不做任何操作
    • 5.2、若一致:修改 secure=true,schema=https,port=https请求的默认端口(httpsServerPort的值,默认为443)
    • 5.3、若不一致:修改 secure=false,schema=http,port=http请求的默认端口(httpServerPort的值,默认为80)
  • 6、调用下一个VAULE对象的invoke 方法,对处理过的request\response进行新的处理
    ——> 会进入项目,经过一系列filter之后,执行controller方法。所以controller中的request是经过tomcat处理的请求;

下一个VAULE对象在测试时是:org.apache.catalina.core.StandardEngineValve的实例

扩展
请求的流转路径
web应用的容器控制(利用 org.apache.catalina.Container的扩展与实现),从左到右按照从最外层容器类型到最内层容器类型的顺序:Engine, HOST, CONTEXT,WRAPPER
在这里插入图片描述
在这里插入图片描述

  • 7、恢复request的HEADER 为传入本方法时的初始状态(执行第一步前的状态,将修改过的值赋值为原值),返回请求给用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值