当前位置: 首页 > article >正文

使用代理和不使用代理request获取host、scheme、url、ip区别

测试代码:

		String host = getRequest().getHeader("Host");
		System.out.println("host:" + host);
		String scheme = getRequest().getScheme();
		System.out.println("scheme:" + scheme);
		String forwardedProto = getRequest().getHeader("X-Forwarded-Proto");
		System.out.println("forwardedProto:" + forwardedProto);
		String url = getRequest().getRequestURL().toString();

浏览器输入:http://127.0.0.1:8080/xpl/demo/dynamicCondition

打印结果:

host:127.0.0.1:8080
scheme:http
forwardedProto:null
url:http://127.0.0.1:8080/xpl/demo/dynamicCondition

使用nginx代理,代理主要配置:

    server {
        listen       443 ssl;
        server_name  my.com;

        ssl_certificate      20241028.pem;
        ssl_certificate_key  20241028.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        location /xpl/demo/dynamicCondition {
            proxy_pass   http://192.168.5.55:8080;

            root   html;
            index  index.html index.htm;
        }

浏览器输入:https://my.com/xpl/demo/dynamicCondition 

打印结果:

host:my.com
scheme:http
forwardedProto:https
url:http://my.com/xpl/demo/dynamicCondition

结论:

 1.从浏览器输入请求地址访问时,浏览器会自动在请求头中添加Host属性,属性值对应请求地址主机地址(有端口号的话,包括端口号)。即http(s)://{主机地址}/。

2.getRequest().getHeader("Host")就是从请求头中获取对应的Host属性。

3.nginx代理如果不配置proxy_set_header Host $http_host;,那么后面打印的应该就是:

192.168.5.55:8080

而不是: 

my.com

 4.默认浏览器发送的请求头中X-Forwarded-Proto应该是没有值的。一般都是代理加上的。

5.getRequest().getScheme()如果web服务器如果没有做ssl配置的话,一般都是返回http。

6.getRequest().getRequestURL()方法前面的协议是与getRequest().getScheme()一致的,即可能与浏览器输入的地址不一样。没有深入的分析源码,初步猜测应该是:

{getScheme()}://{Host}/{getRequestURI()}

 以上结论,是通过上面测试得出的。下面还有些结论就没写具体测试过程了。

关于ip地址

1.request.getRemoteAddr()获取客户端ip地址。这个是tcp/ip网络层协议中获取的ip地址,是请求发出终端的ip地址。无法伪造的。如果使用了代理,返回的就是代理的地址。

2.使用代理的情况,要如何获取用户真实的ip地址呢?这个就要代理服务器告诉你了。需要的代理服务器约定好,比如request.getHeader("X-Real-IP")或者request.getHeader("x-forwarded-for")或者request.getHeader("Proxy-Client-IP")等方法了。具体使用哪种方法得看代理服务器了。上面例子用的是请求头中加入X-Real-IP属性。

3.使用代理获取的用户真实ip地址,有可能被伪造的。比如代理可以在请求头的X-Real-IP属性写入任意ip地址,并不一定是用户真实的ip地址。即如果对用户真实ip地址准确的有严格要求的话,要对代理服务器进行验证,避免伪造代理服务器发起请求,获取到错误的用户ip地址。

关于getRequest().getRequestURI()

1.该方法不会返回空字符串,即使浏览器输入地址

http://127.0.0.1:8080

或者

http://127.0.0.1:8080/

返回值都是"/" 

2.返回值截止至“?”,不包含“?”。例如:

http://127.0.0.1:8080/xpl  返回值是  “/xpl”

http://127.0.0.1:8080/xpl?a=3  返回值是  “/xpl”

http://127.0.0.1:8080/xpl/  返回值是  “/xpl/”

http://127.0.0.1:8080/xpl/?a=3  返回值是  “/xpl/”


http://www.kler.cn/a/377881.html

相关文章:

  • OpenCV相机标定与3D重建(26)计算两个二维点集之间的部分仿射变换矩阵(2x3)函数 estimateAffinePartial2D()的使用
  • 知识图谱+RAG学习
  • 自动驾驶控制算法-横向误差微分方程LQR前馈控制
  • 「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
  • ffmpeg翻页转场动效的安装及使用
  • 将HTML转换为PDF:使用Spire.Doc的详细指南(一) 试用版
  • FOYA传媒科技招聘
  • 第五项修炼—系统思考
  • 二分查找算法—C++
  • 【机器学习】18. 反向传播 Backpropagation algorithm, 学习率,动量Momenetum, Xavier,梯度消失
  • 实用篇:Postman历史版本下载
  • UI设计公司—兰亭妙微—提供轨道交通行业UI设计
  • mysql5安装
  • Qt6 CMake 中引入 Qt Linguist 翻译功能
  • 服务器数据恢复—RAID5阵列中部分成员盘重组RAID5阵列后如何恢复原raid5阵列数据?
  • 九识智能与徐工汽车达成战略合作,共绘商用车未来新蓝图
  • 基于Spring Boot的信息学科平台系统开发指南
  • 将 IBM WatsonX 数据与 Milvus 结合使用,构建用于知识检索的智能 Slack 机器人
  • 鸿蒙生态崛起:开发者机遇与挑战并存
  • 【书籍推荐】使用 MATLAB 算法进行合成孔径雷达信号处理【附MATLAB代码】
  • 整数大小比较c++
  • Win11GBK, idea2024.2.4, 使用Gradle8.8本地安装构建,不使用包装器, 解决utf-8乱码问题, 笔记241028
  • SpringBoot项目如何设置定时任务总开关
  • 视频Qoe测量学习笔记(一)
  • java中checkbox(只为记录,ai生成)
  • C++日期和时间库