解决HttpServletRequest的getScheme()获取不到代理服务器nginx中配置的proxy_set_header X-Forwarded-Proto $scheme参数问题

问题背景我以如下流程图作为说明

nginx配置如下:

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;

但是在后端的HttpServletRequest的getScheme()方法一直获取到的协议为http,开始以为是nginx中配置的参数没有生效  proxy_set_header X-Forwarded-Proto $scheme; 但是在nginx的access.log中打印看到确实是输出了https, 所以原因只能是后端没有获取到这个参数,经过多方查找资料,原来是在Spring 后端中,HttpServletRequest.getScheme() 默认获取的是当前Servlet容器接收到的请求协议,而不是X-Forwarded-Proto 头的值。 当应用程序部署在反向代理(例如 Nginx)后面时,反向代理通常使用 HTTP 与后端服务通信,即使原始请求是通过 HTTPS 发送的。在这种情况下,request.getScheme() 将会返回 http,因为这是反向代理与后端服务之间实际使用的协议

HttpServletRequest.getScheme() 方法并不自动识别X-Forwarded-Proto 请求头。为了使后端服务能够识别并利用这个头信息,需要配置Spring服务来信任代理服务器并使用X-Forwarded-* 请求

<think>好的,用户现在想在ruoyi-vue-pro项目中配置同时支持HTTP和HTTPS的多端口监听。我需要结合之前的对话和提供的引用内容来给出解决方案。 首先,回顾之前的回答,用户已经知道如何通过自定义配置类添加多个HTTP端口。现在需要扩展这个配置,同时支持HTTPS。这可能涉及到生成SSL证书,配置Tomcat的连接器,并确保两个协议都能正确工作。 查看用户提供的引用,引用[1]中提到了devServer的配置,包括端口和代理设置,这可能与前端开发服务器的配置有关,但用户现在的需求是后端多端口监听,所以可能需要参考后端配置。引用[2]中提到了在Linux服务器上部署时修改端口和数据库连接,这里用户需要注意前后端端口的对应,但当前问题主要在后端。引用[3]涉及Redis认证问题,可能不直接相关,但需要注意服务间的配置是否影响端口监听。 接下来,我需要考虑如何同时启用HTTP和HTTPS。通常,这需要配置两个不同的连接器,一个使用HTTP,另一个使用HTTPS。需要生成或获取SSL证书,并在配置中指定密钥库路径和密码。 可能需要修改之前的MultiPortConfig类,添加一个HTTPS的连接器。同时,用户需要确保在application.yml中配置正确的SSL参数,比如端口、密钥库路径和密码。 另外,需要注意若依框架的特定配置,比如是否已经有内置的HTTPS支持,或者是否需要覆盖默认的Tomcat配置。引用[2]中提到修改application.yml中的server.port,这可能也需要调整,因为现在需要多个端口,包括HTTP和HTTPS。 生成SSL证书的步骤可能对用户来说是一个难点,需要详细说明如何使用keytool生成自签名证书,或者如何配置已有的证书。同时,提醒用户在生产环境中使用有效的证书,而不是自签名的。 此外,前端可能需要调整,确保HTTPS请求正确代理到后端,比如在vue.config.js中设置代理到HTTPS端口,但用户的问题主要是后端配置,所以可能不需要深入前端调整,但需要提及可能的注意事项。 在验证部分,需要检查日志是否成功启动了两个端口,并使用curl命令测试HTTP和HTTPS的访问。同时,可能需要处理浏览器对自签名证书的警告,指导用户如何忽略或安装证书。 最后,结合用户之前的问题,可能还需要考虑权限验证、灰度发布和监控等问题,但当前问题集中在多协议端口监听,所以相关问题可能涉及如何在不同端口配置不同的安全策略,或者如何监控HTTPS流量。</think>在若依(RuoYi-Vue-Pro)项目中同时支持HTTP和HTTPS多端口监听,需要扩展嵌入式Tomcat配置。以下是具体实现方案: --- ### 一、核心配置实现 #### 1. 证书准备 生成或获取SSL证书(示例使用自签名证书): ```bash keytool -genkeypair -alias ruoyi -keyalg RSA -keysize 2048 -keystore ruoyi.p12 -validity 3650 ``` #### 2. 配置类改造 ```java // src/main/java/com/ruoyi/framework/config/MultiProtocolConfig.java @Configuration public class MultiProtocolConfig { @Value("${server.http.port:8080}") private int httpPort; @Value("${server.https.port:8443}") private int httpsPort; @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> webServerFactoryCustomizer() { return factory -> { // HTTP连接器 Connector httpConnector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); httpConnector.setPort(httpPort); // HTTPS连接器 Connector httpsConnector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); httpsConnector.setScheme("https"); httpsConnector.setSecure(true); httpsConnector.setPort(httpsPort); httpsConnector.setProperty("SSLEnabled", "true"); httpsConnector.setProperty("keystoreFile", "classpath:ruoyi.p12"); httpsConnector.setProperty("keystorePass", "your_password"); httpsConnector.setProperty("keystoreType", "PKCS12"); httpsConnector.setProperty("clientAuth", "false"); httpsConnector.setProperty("sslProtocol", "TLS"); factory.addAdditionalTomcatConnectors(httpConnector, httpsConnector); }; } } ``` #### 3. 配置文件修改 ```yaml # application.yml server: port: 8080 # 主端口保持HTTP ssl: enabled: true key-store: classpath:ruoyi.p12 key-store-password: your_password key-store-type: PKCS12 key-alias: ruoyi custom: http: ports: 8081,8082 # 附加HTTP端口 https: ports: 8444 # 附加HTTPS端口 ``` --- ### 二、与现有架构的整合 1. **WebSocket协议兼容性** - HTTP和HTTPS协议共享相同的WebSocket端点 `ws://` 和 `wss://`[^1] - 需确保Nginx反向代理配置正确传递协议头: ```nginx proxy_set_header X-Forwarded-Proto $scheme; ``` 2. **安全策略隔离** ```java // 通过请求协议类型实现差异化处理 public class ProtocolAwareInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if ("https".equals(request.getScheme())) { // HTTPS专属安全策略 } return true; } } ``` 3. **前端适配建议** 在`vue.config.js`中配置混合协议支持: ```javascript devServer: { proxy: { '/api': { target: process.env.NODE_ENV === 'production' ? 'https://your-domain:8443' : 'http://localhost:8080', secure: false // 允许代理到自签名证书 } } } ``` --- ### 三、验证与测试 #### 1. 启动日志验证 ```log Tomcat started on port(s): 8080 (http) 8443 (https) Additional ports: 8081 (http) 8082 (http) 8444 (https) ``` #### 2. 协议切换测试 ```bash # HTTP测试 curl http://localhost:8080/api/common/configKey/test # HTTPS测试(需添加-k参数忽略证书验证) curl -k https://localhost:8443/api/common/configKey/test ``` --- ### 四、高级场景配置 #### 场景1:HTTP自动跳转HTTPS ```java @Bean public TomcatServletWebServerFactory servletContainer() { TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(); factory.addRedirectPortMappings( new RedirectPortMapping("http", httpPort, "https", httpsPort) ); return factory; } ``` #### 场景2:动态证书加载 ```java // 通过文件监听实现证书热更新 @Scheduled(fixedDelay = 60000) public void reloadSSLContext() { File keystore = new File("config/ruoyi.p12"); if (keystore.lastModified() > lastModifiedTime) { connector.reloadSslHostConfigs(); } } ``` --- ### 五、注意事项 1. **证书管理** - 生产环境建议使用Let's Encrypt等权威CA证书 - 使用`.jks`格式证书时需修改`key-store-type: JKS` 2. **容器化部署** Docker需同时暴露HTTP/HTTPS端口: ```dockerfile EXPOSE 8080 8081 8082 8443 8444 ``` 3. **性能影响** HTTPS协议会增加约10-15%的CPU消耗,建议: - 启用HTTP/2协议 - 启用会话复用(Session Ticket) ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值