http https session丢失

现象描述

项目中仅在登录时使用https连接进行登录请求,登录成功会使用http访问服务器的其它资源。也就说从https连接切换到http。输入正确的用户和密码后总是跳转到登录页面,并没有跳转到主页面。debug了一下程序,发现在跳转到主页时,程序认为 request.getSession("userInfo") 获取的用户信息为 null,用户没有登录。而不适用https连接请求登录,输入正确的用户名和密码后就可以正确进入主页。也就是说https->http session信息没有了。我们项目使用的是tomcata 7,JDK 7,Spring 4.1。

原因分析

如果需要很好的理解上述现象的原因,需要对Cookie和session机制有一定的了解。这里有一篇资料( http://www.cnblogs.com/fnng/archive/2012/08/14/2637279.html),不理解Cookie和session机制的可以参考一下。
百度了一下出现上述现象的原因。发现在使用https连接请求登录时,Set-Cookie属性值中包含 Secure,这个值代表这个cookie只能在https连接下才能被浏览器传递到服务器进行会话验证,如果是http连接则这个cookie不会被传递到服务器端。用Chrom开发者工具看了一下第一次使用https请求登录页面(注意哟,是第一次请求https连接),Response Headers的Set-Cookie的值如下图:
http https session丢失_第1张图片


也就是说当我们输入正确的用户名密码后,请求登录,跳转到主页是使用http连接。这时,https中的Cookie是不会在http连接时发送到服务器端,服务器端没有检测到JSESSIONID,会新生成一个JSESSIONID,并关联到一个新的session对象(这个新session并没有存储用户登录信息)。也就是造成了https->http时,session丢失。

解决方案

我的登录流程是:请求登录界面(https连接)->提交登录(https连接)->httpsToHttp(https)->index(主页),httpsToHttp连接是为了冲https连接切换到http连接。在httpsToHttp的对应的方法中加入如下代码:
	@RequestMapping(value = "/httpsToHttp", method = RequestMethod.GET)
	public String gotohttpsToHttp(){
		Cookie cookie = new Cookie("JSESSIONID", request.getSession().getId()); 
		response.addCookie(cookie);
		Cookie[] ck = request.getCookies();
		System.out.println("Cookie[] ck = request.getCookies() cookie is null"+(null==ck));

		return "HttpsToHttp";
	}

原理:就是在httpsToHttp连接响应对象response中添加cookie对象,这个对象包括了https是产生的JSESSIONID。也是在http连接是也有个cookie,这不过这个cookie属性值不包含 Secure。

参考资料如下:
http://www.oschina.net/question/8676_3423?fromerr=CaziuJow

你可能感兴趣的:(http,https,session丢失)