会话跟踪是Web程序中常⽤的技术,⽤来跟踪⽤户的整个会话。**保持对⽤户会话期间的数据管理。**常⽤的会话跟踪技术
是Cookie与Session。
通行证、辨认标识
)客户档案
)Cookie是客户端(⼀般指浏览器)请求服务器后,服务器发给客户端的**⼀个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,**服务器就可以通过这个标识来识别客户端的身份或
状态等。
Cookie的作⽤:跟踪会话,记录⼀次会话中(即Session,⼀次会话可能会有多次请求,当然也可以有多个Cookie来跟踪不同的信息)的信息,这样服务器就会知道⽤户的状态,⽐如有没有登录成功,付款时购物⻋中的东⻄等,就相当于贴在客户端脑⻔上的纸条
,浏览器看不到,但服务器看得到
Session是另⼀种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,⽽Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通⾏证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建⽴的⼀份客户档案
,客户来访的时候只需要查询客户档案表就可以了。
区别:数据保存在客户端还是服务器
联系:
Session是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由服务器⽣成⼀个唯⼀的SessionID
,⽤该SessionID 为标识符来存取服务器端的Session存储空间。⽽SessionID这⼀数据则是保存到客户端,⽤Cookie保存的,⽤户提交⻚⾯时,会将这⼀SessionID提交到服务器端,来存取Session数据。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤Cookie,那么Session也会失效。
Cookies是属于Session对象的⼀种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者⼀个Cookie的⽂本⽂件中
;⽽Session则会占⽤服务器资源。所以,尽量不要使⽤Session,⽽使⽤Cookies。但是我们⼀般认为Cookie是不可靠
的,Cookies是保存在本机上的,但是其信息的完全可⻅性且易于本地编辑性,往往可以引起很多的安全问题。Session是可靠地。但是⽬前很多著名的站点也都⽤Cookie。
应用
Cookie应用 | Session应用 |
---|---|
1. 保持用户登录状态 :将⽤户的信息保存到Cookie中,并发送给浏览器,并且将有效时间设置为⼀个较⻓的时间,这样浏览器在以后访问⽹站时,都会带着该Cookie,服务器以此来辨识⽤户,⽤户就不再需要输⼊⽤户名和密码等信息 |
1. 登录 :创建session |
2. 记录用户名 :⼀旦⽤户登录成功以后,下次再登录时,直接将Cookie中的⽤户名读取并显示出来,这样⽤户就不需要再次输⼊⽤户名,只输⼊密码即可 |
2. 退出 :清除session |
生命周期
Cookie有效时间 | Session生命周期 |
---|---|
Cookie发送给浏览器以后,到了⼀定的时间以后浏览器会⾃动销毁Cookie。Cookie的默认有效时间为⼀次会话 (⼀次打开关闭浏览器的过程 ),我们也可以⼿动指定Cookie的有效时间 |
1. Session在⽤户第⼀次访问服务器的时候⾃动创建 。如果尚未⽣成Session,也可以使request.getSession(true)强制⽣成Session。2. Session⽣成后,只要⽤户继续访问,服务器就会更新Session的最后访问时间 ,并维护该Session。⽤户每访问服务器⼀次,⽆论是否读写Session,服务器都认为该⽤户的Session“活跃 (active)”了⼀次。 3. 由于会有越来越多的⽤户访问服务器,因此Session也会越来越多。为防⽌内存溢出,服务器会把⻓时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间 。如果超过了超时时间没访问过服务器,Session就⾃动失效 了。 |
设置cookie有效时间
//setMaxAge⽤来设置Cookie的最⼤有效时间,需要int型的参数,代表有效的秒数
cookie.setMaxAge(秒数);
//当参数⼤于0时,会设置为指定的 秒数
cookie.setMaxAge(30);
//当参数等于0时,浏览器 不会保存Cookie,Cookie⽴即失效
cookie.setMaxAge(0);
//当参数⼩于0时,和 不设置是⼀样,当前会话有效
cookie.setMaxAge(-100);
//设置⼀个永久有效的Cookie,并⾮永久,只是使Cookie的⽣命很⻓⽽已
cookie.setMaxAge(60*60*24*365*10);
Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。
Session的超时时间也可以在web.xml中修改。另外,通过调⽤Session的invalidate()⽅法可以使Session失效。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Cookie的设置和获取
方法1: 通过HttpServletResponse.addCookie的⽅式设置Cookie
注意:new Cookie()时两个参数都是字符串
Cookie cookie = new Cookie("jieguo","true");
response.addCookie(cookie);
方法2:浏览器中查看cookie的值
方法3:服务端获取客户端携带的cookie:通过HttpServeltRequest获取
<%
Cookie[] cookies = request.getCookies();
if(cookies != null)
for(Cookie c : cookies){
String name = c.getName();//获取Cookie名称
if("jieguo".equals(name)){
String value = c.getValue();//获取Cookie的值
bool = Boolean.valueOf(value);//将值转为Boolean类型
}
}
%>
删除cookie
通过设置同名Cookie的最⼤存活时间为0,删除Cookie是指使浏览器不再保存Cookie,使Cookie⽴即失效
举例:使name为username的Cookie⽴即失效
//1.创建⼀个name为username的Cookie
Cookie cookie = new Cookie("username", "aaa");
//2.设置Cookie的有效时间为0
cookie.setMaxAge(0);//删除cookie的关键
//3.将cookie发送给浏览器,来 替换同名Cookie
response.addCookie(cookie);
创建Session的格式
Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应⼀个Session对象,所有该客户的状态信息都保存在这个Session对象⾥。Session对象是在客户端第⼀次请求服务器的时候创建的。
Session也是⼀种key-value的属性对,通过getAttribute(Stringkey)
和setAttribute(String key,Objectvalue)
⽅法读写客户状态信息。Servlet⾥通过request.getSession()
⽅法获取该客户的 Session
例如:
HttpSession session = request.getSession(); // 获取Session对象
session.setAttribute("loginTime", new Date()); // 设置Session中的属性
out.println("登录时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性
Session的常用方法
⽅ 法 名 | 描 述 |
---|---|
void setAttribute(Stringattribute, Object value) | 设置Session属性。value参数可以为任何Java Object。通常为JavaBean。value信息不宜过⼤ |
String getAttribute(String attribute) | 返回Session属性 |
Enumeration getAttributeNames() | 返回Session中存在的属性名 |
void removeAttribute(String attribute) | 移除Session属性 |
String getId() | 返回Session的ID。该ID由服务器⾃动创建,不会重复 |
long getCreationTime() | 返回Session的创建⽇期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.getCreationTime()) |
long getLastAccessedTime() | 返回Session的最后活跃时间。返回类型为long |
int getMaxInactiveInterval() | 返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效 |
void setMaxInactiveInterval(int second) | 设置Session的超时时间。单位为秒 |
boolean isNew() | 返回该Session是否是新创建的 |
void invalidate() | 使该Session失效 |