13,使用Cookie
Cookie是在浏览器存储信息的一种方式,服务器可以响应浏览器set-cookie标头,浏览器收到这个标头与数值后,会将它以文件的形式存储
在计算机上,这个文件就称之为Cookie。
HTTP中Cookie的设定是通过set-cookie标头,所以必须在实际响应浏览器之前使用addCookie()来新增Cookie实例,在浏览器输出HTML响应之后
再运行addCookie()是没有作用的。
取得浏览器存储Cookie,可以从HttpServletRequest的getCookies()来取得,这可取得该网页所属域的所有Cookie,所以返回值是Cookie[]数组:
Cookie[] cookies=request.getCookies();
if(cookies!=null){
for(Cookies cookie:cookies){
String name=cookie.getName();
String value=cookie.getValue();
................
}
}
14,HttpSession会话管理原理
HttpSession并非线程安全,所以必须注意属性设定时共享存取的问题。
实际上如何得知数个请求间的关系是由Web容器执行的,Web应用程序基于HTTP协议无状态的事实并没有改变。
尝试运行HttpServletRequest的getSession()时,Web容器会创建HttpSession对象,关键在于每个HttpSession对象都会有个特殊的ID
,称为SessionID。SessionID默认会使用Cookie存放在浏览器中,在Tomcat中,Cookie的名称时JSESSIONID,数值则是getID取得的
SessionID。
由于Web容器本身是执行于JVM中的一个java程序,通过getSession()取得HttpSession,是Web容器中的一个java对象,HttpSession中存放的属性,自然
也存在于服务端web容器中。每一个HttpSession各有特殊的SessionID,当浏览器请求应用程序时,会将Cookie中存放的SessionID一并发送给应用程序,
Web容器会根据SessionID来找出对应的HttpSession对象,这样可以取得各浏览器个别的会话数据。
所以使用HttpSession进行绘画管理,设定为属性的对象存储与服务端,SessionID默认使用Cookie存放于浏览器端。Web容器存储SessionID的Cookie默认为
关闭浏览器就失效,所以重新启动浏览器请求应用程序时,通过getsession取得的是新的HttpSession对象。
默认关闭浏览器会马上失效的是浏览器上的Cookie,不是HttpSession。因为Cookie失效了,就无法通过Cookie来发送SessionID,所以尝试getSession(),容器会产生
新的HttpSession。要让HttpSession立即失效必须调用invalidate()方法,否则HttpSession会等到设定的时间过后才会被容器销毁回收。
15,HttpSession与URL重写
HttpSession默认使用Cookie存储SessionID,如果用户关掉浏览器接收Cookie的功能,就无法使用Cookie在浏览器存储SessionID。如果在
用户禁掉Cookie的情况下,仍打算运用HttpSession来进行会话管理,那么可以搭配URL重写。
使用URL重写的方式来发送SessionID,可以使用HttpServletResponse的encodeURL()协助产生所需的URL重写。
若能从HTTP请求中取得带有SessionID的Cookie,encodeURL()会将传入的URL原封不动地输出。如果容器尝试取得HttpSession实例时,无法从HTTP请求中取得带有
SessionID的Cookie时(通常为浏览器禁用Cookie的情况),encodeURL()会自动产生带有SessionID的URL重写。
如果执行encodeURL(),在浏览器第一次请求网站时,容器并不知道浏览器是否禁用Cookie,所以容器的作法是Cookie(发送set-cookie标头)与URL重写
的方式,因此若Servlet有以下语句,无论浏览器有无禁用Cookie,第一次请求时,都会现实在SessionID的URL:
request.getSession();
out.println(response.encodeURL("index.jsp"));
有一个encodeRedirectURL()方法,则可以在要求浏览器重定向时,在URL上显示SessionID。