Tomcat https重定向到http的端口获取问题 | https重定向到http session失效问题


后台系统需要在登录页面使用SSL(https)连接,登录后的其他页面使用普通http连接,网上查资料后通过tomcat配置和web.xml的配置基本实现了:
1.登陆页强制使用https连接
2.未登录时,普通http请求的页面会强制重定向为使用https连接的登录页。

现在使用https登录后重定向到http时出现了问题,我采用的是在代码中写入完整的重定向地址(例:http://localhost:8000/index)
问题在于我无法自动获取得到http请求的端口号,通过request.getServerPort()获取的端口是https的端口号。
想了解:
1.有没有什么方法可以直接在tomcat service.xml中配置https自动重定向到http
2.如果通过tomcat配置无法实现是否可以在后台代码中获取tomcat中配置的http,https的端口号
3.如果无法获取http,https的端口号,通过写配置文件来设置端口号,有什么比较好的方案,系统使用的是spring+jpa

ssl tomcat

Caiych 12 years, 8 months ago

没人回答,最后只能写了一个TomcatPort类,在服务器启动的时候用spring自动注入配置文件中的设置的http,https端口号


今天测试的时候发现了问题,https重定向到http的时候session会丢失,要连续登陆两次才能成功。
网上查了下资料说是https与http因为端口的关系不是同域,还有的说HTTPS下的会话cookie被标记为“secure”,不能被使用在HTTP。浏览器将不会发送cookie回服务器。具体明天再测试看看


将jsessionId从request中获取出来,加到http的重定向url后面,可以解决https->http session失效问题,但是对于系统的全部子页面都需要进行参数添加,工作量太大,所以不得不放弃这个方案

   
  String jsessionId = request.getRequestedSessionId();
  
String redirectUrl=
"http://"+request.getServerName()+":"+tomcatPort.getHttpPort()+request.getContextPath()+"/index;jsessionId="+jsessionId;
return "redirect:" + redirectUrl;

让页面在http请求下创建出新的非secure状态的会话cookie,然后再重定向到https页面,在https页面登陆后重定向回http页面。因为非secure状态的会话cookie可以再https,http之间自由传递,所以session不会丢失。
http-->https-->http

   
  1.http: 新页面请求无会话cookie,service自动生成session,并返回对于的非secure状态的会话cookic
  
2.http-->https:重定向,非secure状态的会话cookic可以自由在http,https之间相互传递,https页面下储存的是非secure状态的会话cookic
3.https-->http:登陆后重定向,非secure状态的会话cookic可传播到http页面,session信息不丢失

https-->http-->https-->http

   
  1.https:新页面请求无会话cookie,service自动生成session,并返回对应的Secure状态的会话cookic
  
2..https-->http: 重定向,Secure状态的cookic无法从https传递到http,service判定http无状态,自动生成session,并返回对应的非secure状态的会话cookic
3.同http-->https-->http过程···

最终解决方案:
在https登陆后重定向到http的代码之前设置新的非secure状态的会话cookic,覆盖原来Secure状态的会话cookic

   
  Cookie cookie = new Cookie("JSESSIONID", request.getSession().getId());
  
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
String redirectUrl =
"http://"+request.getServerName()+":"+tomcatPort.getHttpPort()+request.getContextPath()+"/index";
return "redirect:" + redirectUrl;

帕金森症候群 answered 12 years, 8 months ago

Your Answer