redirect跳转https变为http问题的深入思考【转】

news/2024/11/8 17:18:38/文章来源:https://www.cnblogs.com/paul8339/p/18535470

背景
服务部署以及跳转展示如下:

 

用户https请求通过阿里云负载通过http到指定应用,应用返回跳转路径(状态为302),但跳转路径为http(不为https),所以访问不了
2.1 跳转伪代码:

// ModelAndView
mv.setViewName(WebCst.REDIRECT + "/admin/sso/login");
1
2
2.2 浏览器跳转截图


结论总结
用nginx负载返回给浏览器的Location为https是因为nginx做了处理,关键配置见下

proxy_set_header Host $host;
proxy_redirect http:// https://;
1
2
1.1 用arthas的trace命令观察线上,应用直接返回的Location为http://localhost:8232/exp-admin/admin/sso/login

watch org.apache.catalina.connector.Response toAbsolute -x 2
1
将nginx替换成SLB后,返回给浏览器的Loaction变为http是因为SLB缺少相应的配置
2.1 SLB相关配置:https://help.aliyun.com/document_detail/97646.html

跳转的Location是如何生成的
后台是以springboot进行开发的,下面的分析都是基于springboot方式进行

先展示一下springmvc的工作原理

2.1 我们跳转设置为:mv.setViewName(WebCst.REDIRECT + “/admin/sso/login”); 结合上图,猜测根据视图进行跳转

2.2 视图解析器ContentNegotiatingViewResolver通过resolveViewName解析视图,得到跳转视图:RedirectView,调用其render进行跳转

以RedirectView#render进行跳转分析

3.1 下图显示以是否兼容http1.0(http10Compatible) 进行区分获取Location
(1)默认是兼容http1.0,故response.sendRedirect(encodedURL);

(2)response.sendRedirect(encodedURL)最终会触发到tomcat的org.apache.catalina.connector.Response的sendRedirect方法


public void sendRedirect(String location, int status) throws IOException {
locationUri = toAbsolute(location);
setStatus(status);
setHeader("Location", locationUri); //设置跳转的location
}
1
2
3
4
5
3.2 跳转Location生成的入口:org.apache.catalina.connector.Response#toAbsolute

// 从request中获取协议、IP、端口信息,然后和设置的相对路径拼接起来
protected String toAbsolute(String location) {
String scheme = request.getScheme();
String name = request.getServerName();
int port = request.getServerPort();
redirectURLCC.append(scheme, 0, scheme.length());
redirectURLCC.append("://", 0, 3);
redirectURLCC.append(name, 0, name.length());
if ((scheme.equals("http") && port != 80)
|| (scheme.equals("https") && port != 443)) {
redirectURLCC.append(':');
String portS = port + "";
redirectURLCC.append(portS, 0, portS.length());
}
redirectURLCC.append(location, 0, location.length());
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Request中协议信息在哪生成


根据调用栈发现,在ConnectionHandler处理连接时,根据SocketEvent进行区别处理


在Http11Processor处理OPEN_READ事件时会对请求进行预处理
public SocketState service(SocketWrapperBase<?> socketWrapper)
throws IOException {
prepareRequestProtocol(); //设置为http1.1
prepareRequest(); //处理协议(http或者https)
getAdapter().service(request, response); //调用后面Dispatcher
}

在prepareRequest判断是否开启SSL,如果开启则为https
private void prepareRequest() throws IOException {
if (protocol.isSSLEnabled()) {
request.scheme().setString("https");
}
}

nginx对跳转的设置
nginx官网对跳转描述:https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
设置在代理服务器响应的“Location” 头字段中更改的文本。
2.1 假设代理服务器返回头字段 “ Location: http://localhost:8000/two/some/uri/”。该指令proxy_redirect http://localhost:8000/two/ http://frontend/one/; 将此字符串重写为“ Location: http://frontend/one/some/uri/”。
2.2 在可以正常跳转的nginx上的配置为如下,将http转换成Https
proxy_set_header Host $host;
proxy_redirect http:// https://;

本地应用SSL配置:https://zhuanlan.zhihu.com/p/31385073
#https端口号.
server.port: 443
#证书的路径.
server.ssl.key-store: tomcat.keystore
#证书密码,请修改为您自己证书的密码.
server.ssl.key-store-password: 123456
#秘钥库类型
server.ssl.keyStoreType: PKCS12
#证书别名
server.ssl.keyAlias: tomcat

转自

redirect跳转https变为http问题的深入思考-CSDN博客
https://blog.csdn.net/weixin_40803011/article/details/121560609

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828898.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tag

最近遇到的某些面试官我:

长尾效应

在正态分布中,曲线中间凸起的是“头”,两边相对平缓的部分叫做“尾”。 对于绝大部分的需求来说,都会集中在中间凸起的“头”处,但是除了“头”,还有两边长长的“尾”。不同于中间的“头”,分布在尾部的需求是个性化的,零散的,少量的需求。这部分需求,构成了一条长长的…

树莓派开机自启动热点(使用有线eth0上网,使用wlan0进行热点)

一、背景内容 其实就是接了一单,有人需要我帮忙配置一下树莓派开机启动热点。这边做个记录,该方式树莓派4B、3B都可以使用。 二、实际操作 1、使用网线连接路由器和树莓派 树莓派的网络接口一共有三个,分别是:eth0:有线网络接口(以太网接口) wlan0:无线网络接口(WiFi接…

07C++选择结构(1)

1、基础知识; 2、if语句; 3、if-else 语句; 4、if语句嵌套; 5、字符串类型string一、基础知识 1、关系运算符 因为我们要对条件进行判断,必然会用到关系运算符:名称 大于 大于等于 小于 小于等于 等于 不等于符号 > >= < <= == !=关系表达式的值是一个逻辑值…

测试开发通关秘籍五: 彻底搞懂map,reduce和filter高阶函数

热爱技术的小牛 测试开发通关秘籍五: 彻底搞懂map,reduce和filter高阶函数 map、r测试开发通关秘籍五: 彻底搞懂map,reduce和filter高阶函数 map、reduce 和 filter 是 Python 中用于处理可迭代对象(如列表、元组等)的高阶函数。它们分别用于不同的操作,适合于不同的场景…

2024.11.8 鲜花

sosdp,FMT,FWT 下Moon Halo Some deserts on this planet were oceans once 这颗星球上的一些沙漠曾是海洋 Somewhere shrouded by the night, the sun will shine 被黑夜笼罩的地方,也会迎来光明 Sometimes I see a dying bird fall to the ground 偶尔也会见到濒死的鸟跌落地…

DB157S-ASEMI小贴片整流桥DB157S

DB157S-ASEMI小贴片整流桥DB157S编辑:ll DB157S-ASEMI小贴片整流桥DB157S 型号:DB157S 品牌:ASEMI 封装:DBS-4 特性:贴片桥堆 正向电流:1.5A 反向耐压:1000V 恢复时间:>2000ns 引脚数量:4 芯片个数:4 芯片尺寸:50MIL 浪涌电流:50A 漏电流:>10uA 工作温度:-55…

数码管驱动控制器-VK1638 SOP28点阵数显驱动芯片LED驱动器原厂FAE技术支持

产品品牌:永嘉微电/VINKA 产品型号:VK1638 封装形式:SOP28 概述 VK1638是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3线 串行接口、数据锁存器、LED 驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴 极,可支持10SEGx8GRID的点阵LED显示面板,…

从消息中间件架构发展趋势,探讨物联网平台如何支持亿级设备推送?

华为云IoT不仅仅深度使用了Apache Pulsar,同时还积极参与Pulsar社区的发展,致力于提升Pulsar的安全性、可靠性和功能性。本文分享自《华为云DTSE》第五期开源专刊,作者:贺张俭 华为云IoT技术专家 随着物联网平台业务的快速增长,基于传统消息中间件构筑面临着处理亿级设备连…

docker desktop报错0x80070422

docker desktop报错0x80070422 deploying WSL2 distributionsensuring main distro is deployed: deploying "docker-desktop":importing WSL distro"无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动。\r\n错误代码:Ws1/0x80070422\r\n"outpu…

SqlServer 分页学习

在B站上看到一个分页视频,老师讲的挺好 ,记录下来。想看原视频的可以去B站 --1.建立Students表CREATE TABLE students ( ID INT PRIMARY KEY IDENTITY(1,2), NAME NVARCHAR(50) NOT NULL, SEX CHAR(6) CHECK (SEX IN (Male, Female)));GO --2. 插入30条数据INSERT I…

TMC4671使用笔记

1、单向DC电机开环测试void TMC4671SinglePhaseDC_Test(){// 电机类型和PWM配置// TMC4671_MOTOR_TYPE_N_POLE_PAIRS 寄存器用于设置电机类型和极对数。// 高16位 (0x0001):电机类型。0: 无电机 1: 单相直流电机 2: 两相步进电机 3: 三相无刷电机// 低16位 (0x0002):电机的极…