启用SSL的Spring Boot应用重定向外部HTTP站点被自动转HTTPS如何解决
解决Spring Boot SSL站点重定向外部HTTP地址被自动转HTTPS的方案
根因说明
这个问题通常来自两个层面的配置:
- Spring Boot全局SSL配置开启了HTTP强制跳转,会自动修改所有重定向地址的协议为HTTPS
- 浏览器开启了HSTS缓存,会自动把你站点触发的所有跳转地址从HTTP升级为HTTPS
修复步骤
1. 调整SSL和HSTS配置
先在application配置文件中关闭自动HTTP跳转:
# application.properties server.ssl.redirect-http-to-https=false
同时关闭Spring Security默认开启的HSTS响应头(测试阶段建议关闭,生产如果需要保留可以调整includeSubDomains和preload配置,不要作用于外部站点):
@Configuration public class WebSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 你的其他安全规则不变 .headers(header -> header .httpStrictTransportSecurity(hsts -> hsts.disable()) ); return http.build(); } }
调整后记得清空浏览器缓存,HSTS的默认缓存时间最长可达1年,不清缓存规则不会失效。
2. 手动构造重定向响应,避免Spring视图解析器修改地址
不要用redirect:前缀或者ModelAndView的重定向写法,这两种都会被Spring的视图解析器处理,可能被自动修改协议,改用直接构造ResponseEntity返回重定向响应,同时兼容返回视图的需求:
@GetMapping("/yourEndpoint") public Object handleRequest(@RequestParam(required = false) String redirectKey) { // 逻辑判断:需要跳转外部地址时 if (redirectKey != null) { // 从数据库读取原始地址,不要做任何协议替换 String originTargetUrl = yourDao.getTargetUrl(redirectKey); return ResponseEntity.status(HttpStatus.FOUND) .header(HttpHeaders.LOCATION, originTargetUrl) .build(); } // 不需要跳转时正常返回视图 return new ModelAndView("yourHtmlView"); }
这种方式下你设置的Location响应头会原样返回给浏览器,不会被Spring的全局配置修改。
3. 排查全局拦截器的Header修改逻辑
如果修改后还是不生效,检查项目中所有的HandlerInterceptor、Filter、ResponseBodyAdvice实现,是否有全局替换响应头中Location字段协议的逻辑,加上例外规则:只有内部跳转地址才做协议替换,外部跳转地址保持原样即可。
内容的提问来源于stack exchange,提问作者Moshiur Rahman
相关产品推荐
相关产品推荐

