会话管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
会话管理
1、会话管理基本原理
实现会话管理的基本方式,如隐藏域(Hidden Field)、Cookie与URL重写(URL Rewriting)的实现方式。
1.使用隐藏域
隐藏域就是主动告知服务器多次请求间必要信息的方式之一。
这个方法不适合用于隐密性较高的数据。
隐藏域不是Servlet/JSP实际管理会话时的机制。
2.使用Cookie
Cookie是在浏览器存储信息的一种方式,服务器可以响应浏览器set-cookie标头,
浏览器收到这个标头与数值后,会将它以文件的形式存储在计算机上,这个文件
就称之为Cookie。一个常见的应用,自动登录。
Cookie可以设定存活期限,所以在客户端存储的信息可以活得更久一些。
Servlet本身提供了创建、设置与读取Cookie的API。如果你要创建Cookie,可以
使用Cookie类,创建时指定Cookie中的名称与数值,并使用HttpServletResponse
的addCookie()方法在响应中新增Cookie。
例:Cookie cookie = new Cookie("user","caterpillar");
cookie.setMaxAge(7*24*60*60);//单位是秒
response.addCookie(cookie);
HTTP中Cookie的设定是通过set-cookie标头,所以必须在实际响应浏览器之前
使用addCookie()来新增Cookie实例,在浏览器输出HTML响应之后再运行
addCookie()是没有作用的。
要取得浏览器上存储的Cookie,则可以从HttpServletRequest的getCookies()来取
得,这可取得属于该网页所属域(Domain)的所有Cookie,返回值是Cookie[]
数组。取得Cookie对象后,可以使用Cookie的getName()与getV alue()方法,分
别取得Cooke的名称与数值。
例:Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
String name = cookie.getName();
String value = cookie.getV alue();
........
}
}
在Servlet3.0中,Cookie类新增了setHttpOnly()方法,可以将Cookie标示为仅用
于HTTP,这会在set-cookie标头上附和HttpOnly属性,在浏览器支持的情况下,
这个Cookie将不会被客户端脚本读取,可以使用isHttpOnly()来得知一个Cookie
是否被setHttpOnly()标示为仅用于HTTP。
3.使用URL重写
所谓URL重写(URL Rewriting),其实就是GET请求参数的应用,当服务器响
应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中
包括请求参数信息。
2、HttpSession会话管理
即使用户关掉浏览器接收Cookie的功能,HttpSession也可以改用URL重写断续其会话管理功能。HttpSession并非线程安全,所以必须注意属性设定时共享存取的问题。
1.使用HttpSession
进行会话管理,可以使用HttpServletRequest的getSession()方法取得HttpSession对
象。
getSession()方法有两个版本,另一个版本可以传入布尔值,默认是true,表示若尚
未存在HttpSession实例时,直接创建一个新的对象。若传入false,若尚未存在
HttpSession实例,则直接返回null。
最常使用的方法是setAttribute()与getAttribute(),invalidate()。
例:HttpSession session = request.getSession();//取得会话
session.setAttribute("name",value);//存储会话值
(简写:request.getSession().setAttribute("name",value);)
——————————————————————————
HttpSession session = request.getSession();//取得会话
session.getAttribute("name");//取得会话值
Session.invalidate();//使HttpSession失效
2.HttpSession会话管理原理
使用HttpSession进行会话管理十分方便,让Web应用程序看似可以“记得”浏览
器发出的请求,连接数个请求间的关系。但无论如何,Web应用程序其于HTTP
协议的事实并没有改变,实际上如何“得知”数个请求之间的关系,这件工作是由
Web容器帮你执行。
尝试运行HttpServletRequest的getSession()时,Web容器会创建HttpSession对象,
关键在于每个HttpSession对象都会有个特殊的ID,称为Session ID,你可以执行
HttpSession的getId()来取得Session ID。这个Session ID默认会使用Cookie存放
在浏览器中。在Tomcat中,Cookie的名称是JSESSIONID,数值则是getId()所取
得的Session ID。
由于Web容器本身是执行于JVM中的一个Java程序,通过getSession()取得
HttpSession,是Web容器中的一个Java对象,HttpSession中存放的属性,自然也
就存放于服务器端的Web容器之中。每一个HttpSession各有特殊的Session ID,