Session和Cookie总结
一.Session和Cookie
1.Cookie
1.cookie创建于服务器,保存于浏览器,保存了特定网站操作记录和资料凭证的信息。
2.未设置cookie期限的时候,默认是关闭浏览器后cookie消失,此时cookie保存于内存中,这种cookie称为会话cookie。
3.设置了过期时间的cookie会被保存到硬盘中,在下次启动浏览器后,只要还未超过过期时间还能继续使用,过期将被清除。
4.cookie过期时间通过 cookie.setMaxAge(2000) 来设置。
注意:设置了cookie.setMaxAge但是下次请求通过req.getMaxAge()取得的值总是-1的原因如下:
第一次请求服务时,服务器端传输cookie并写到客户端,浏览器关闭,cookie设置生效。
第二次请求服务,request请求传给服务端,但在这个request中是不包含maxage值的,所以服务端取到的值还是默认值-1。也就是说设置完maxage值后,maxage不会再被服务端读取和修改了。这一过程由浏览器完成,浏览器判断maxage的值,从而判断cookie是否过期,期间服务器并不会参与cookie的生命周期过程。所以你在debug中取到的值一直是默认值!
2.Session
Session保存于服务器,为了高速存取,一般放在内存中,在浏览器第一次请求服务去的时候会为浏览器创建一个Session,因为HTTP请求是无状态的,所以会在浏览器端以Cookie形式保存一个JSESSIONID用于查找保存在服务器端session的凭证。
每次请求的时候会判断请求头是否含有可用的JSESSIONID的Cookie,通过JSESSIONID查找对应的session,如果不存在则重新创建一个session,并把JSESSION保存到浏览器。所以二次请求的时候请求头里是带有JSESSIONID的Cookie的,通过jsessionid ==request.getSession().getId()获取sessionID.
JSESSIONID的Cookie会在浏览器关闭后清除,下次从新开启时是不存在的 。
请求流程:
二.Session生命周期
1.session过期时间:
session的是保存浏览器和服务器间信息的一块内存,在服务器规定时间内,如果浏览器没有对服务器进行任何的请求,那么规定时间段结束,服务器将会清除该过期的session,并释放内存,不然越来越多的session占用了内存却不工作,会导致服务器内存不断消耗,导致服务器崩溃。tomcat默认保存时间是30分钟(这是指在30分钟内浏览器不发生任何请求行为,如果有请求行为每次这个时间都会更新重置)
这个时间可以在tomcat目录下的conf/web.xml文件内修改
2.Session对浏览器的要求:
Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。
注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择"在新窗口中打开"时,子窗口便可以访问父窗口的Session。
3.如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?
例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。
URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String url)实现URL地址重写,
该方法的实现机制为:
● 先判断当前的 Web 组件是否启用 Session,如果没有启用 Session,直接返回参数 url。
● 再判断客户端浏览器是否支持 Cookie,如果支持 Cookie,直接返回参数 url;如果不支持 Cookie,就在参数 url 中加入 Session ID 信息,然后返回修改后的 url。
禁用了Cookie重写了URL:
未禁用Cookie:
注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。