文章目录
1.会话跟踪技术
Http
是无状态的协议,多次请求之间没有关系,因此需要使用会话跟踪技术,保持一个会话当中的多次请求当中的身份识别和数据管理。
Cookie
:在客户端记录信息确定用户的身份。Session
:通过在服务器端记录确定用户的身份。
2.Cookie
2.1什么是Cookie
Cookie是客户端(⼀般指浏览器)请求服务器后,服务器发给客户端的⼀个辨认标识,保存在客户端,当客户端再次向服务器发送请求时,会携带着这个辨认标识,服务器就可以通过这个标识来识别客户端的身份或状态等。
2.2 应用场景
2.2.1 保持⽤户登录状态
将⽤户的信息保存到Cookie中,并发送给浏览器,并且将有效时间设置为⼀个较⻓的时间,这样浏览器
在以后访问⽹站时,都会带着该Cookie,服务器以此来辨识⽤户,⽤户就不再需要输⼊⽤户名和密码等
信息。
2.2.2 记录⽤户名
⼀旦⽤户登录成功以后,下次再登录时,直接将Cookie中的⽤户名读取并显示出来,这样⽤户就不需要再次输⼊⽤户名,只输⼊密码即可。
2.3 Cookie的设置和获取
2.3.1 设置Cookie
Cookie cookie = new Cookie("key", "value");
resp.addCookie(cookie);
2.3.2 获取Cookie
Cookie[] cookies = req.getCookies();
for (int i = 0; i < cookies.length; i++) {
String cookieValue = cookies[i].getName() + "=" + cookies[i].getValue();
writer.println(cookieValue);
}
2.4 删除Cookie
通过设置同名Cookie的最⼤存活时间为0,删除Cookie是指使浏览器不再保存Cookie,使Cookie⽴即失效。
//1.创建⼀个name为username的Cookie
Cookie cookie = new Cookie("username", "aaa");
//2.设置Cookie的有效时间为0
cookie.setMaxAge(0);//删除cookie的关键
//3.将cookie发送给浏览器,来替换同名Cookie
response.addCookie(cookie);
2.5 设置Cookie有效时间
Cookie发送给浏览器以后,浏览器并不会永久保存,也就是到了⼀定的时间以后浏览器会⾃动销毁Cookie。Cookie的默认有效时间为⼀次会话(⼀次打开关闭浏览器的过程),我们也可以⼿动指定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);
3 Session
3.1 什么是Session
Session是另⼀种记录客户状态的机制,保存在服务器上,
3.2 应用场景
- 登录后状态维持。
- 退出登录,清除session
3.3 创建
Session对象是在客户端第⼀次请求服务器的时候创建的。
3.4 生命周期
- Session在⽤户第⼀次访问服务器的时候⾃动创建。访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未⽣成Session,也可以使request.getSession(true)强制⽣成Session
- Session⽣成后,只要⽤户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。⽤户每访问服务器⼀次,⽆论是否读写Session,服务器都认为该⽤户的Session“活跃(active)”了⼀次。
- 由于会有越来越多的⽤户访问服务器,因此Session也会越来越多。为防⽌内存溢出,服务器会把⻓时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就⾃动失效了。
- Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。
3.5 获取session
当使用session的时候会使用一个JSESSIONID放入到cookie作为后台获取session的依据。
HttpSession session = request.getSession();
3.6 session 常用方法
3.7 session 失效
- 直接调用
session
的invalidate
方法。 - 等到非活动时间到达,后端自己清理。
removeAttribute("key")
;
4 Cookie 和 Session 之间的区别
(1) Cookie数据保存在客户端,Session数据保存在服务器端。
(2) Session是由应⽤服务器维持的⼀个服务器端的存储空间,⽤户在连接服务器时,会由服务器⽣成⼀个唯⼀的SessionID,⽤该SessionID 为标识符来存取服务器端的Session存储空间。⽽SessionID这⼀数据则是保存到客户端,⽤Cookie保存的,⽤户提交⻚⾯时,会将这⼀SessionID提交到服务器端,来存取Session数据。这⼀过程,是不⽤开发⼈员⼲预的。所以⼀旦客户端禁⽤Cookie,那么Session也会失效。
(3) Cookies是属于Session对象的⼀种。但有不同,Cookies不会占服务器资源,是存在客服端内存或者⼀个Cookie的⽂本⽂件中;⽽Session则会占⽤服务器资源。所以,尽量不要使⽤Session,⽽使⽤Cookies。但是我们⼀般认为Cookie是不可靠的,Cookies是保存在本机上的,但是其信息的完全可⻅性且易于本地编辑性,往往可以引起很多的安全问题Session是可靠地。但是⽬前很多著名的站点也都⽤Cookie。