Cookie和Session
1. 会话
浏览器第一次给服务器发送资源请求,会话建立直到有一方断开连接为止。
一次会话中包含多次请求和响应
作用:一次会话范围内的多次请求间共享数据
方式:
(1)客户端会话技术:cookie
(2)服务器端会话技术:session
2. Cookie
2.1 使用
①创建Cookie对象
Cookie(String name,String value)
②发送Cookie
//HttpServletResponse void addCookie(Cookie cookie)
③另一个Servlet获取Cookie,获取数据
//HttpServletRequest Cookie[] getCookies()
2.2 其它
(1)一次可以发送多个cookie
(2)cookie可在浏览器中保存多久
①默认浏览器关闭后,cookie数据销毁
②持久化存储
//Cookie void setMaxAge(int seconds)
正数:cookie数据写到硬盘,以seconds表示cookie存活时间
负数:默认值,cookie只在内存中,浏览器关闭则销毁
0:删除cookie信息
(3)中文的问题
tomcat 8之前cookie中不能直接存储中文,之后的可以
特殊字符支持也不好,要用URLEncoder编解码
(4)cookie获取的范围
①默认cookie只在一个web应用内共享,可通过 setPath 设置更大的共享范围(默认setPath是当前web项目)使得cookie可在一个服务器的多个应用中共享
//Cookie void setPath(String uri)
②多个服务器间共享
//Cookie void setDomain(String pattern) String getDomain()
如果设置domain的一级域名相同,则多个服务器间可以共享cookie
(5)特点
cookie存储在浏览器端
浏览器对单个cookie大小、同一个域名下的cookie数目有限制
cookie用来存储少量不太敏感的信息; 在不登录的情况下,实现服务器对客户端的身份识别
3. HttpSession
会话期间存在,直到浏览器关闭或一定的时间后浏览器没有发出请求后session会被清除
获取:
//HttpServletRequest HttpSession getSession() HttpSession getSession(boolean create)
使用:
//HttpSession void setAttribute(String name,Object value) void removeAttribute(String name) Object getAttribute(String name)
销毁:
void invalidate()
生命周期相关:
long getLastAccessedTime() 客户端最后一次与会话关联的请求时间 int getMaxInactiveInterval() 一个会话内两个请求的最大时间间隔,单位秒 void setMaxInactiveInterval(int s)
Session基于Cookie(Cookie从服务器响应给客户端,在客户端再次请求时将此Cookie直接发送给服务器),而Session内容保存在服务器,通过Cookie将Session的ID响应给Cookie,浏览器再次请求时带着这个ID。
(1)浏览器关闭后,再次访问,还希望能获得之前相同的session?
默认,浏览器关闭后再次访问获得的session不是同一个。
由于session在浏览器关闭后在服务物器里还会存在一段时间,可通过手动保存session的ID到Cookie,响应到客户端,浏览器关闭后再次访问可通过此Cookie获取相同的Session
Cookie cookie = new Cookie("JSESSIONID",session.getID());
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
(2)客户端没有关闭,而服务器重启
服务器重启后,session销毁了,客户端再次访问,不能获得同一个session
解决:
session钝化:在服务器正常关闭前,将session对象序列化到硬盘
session活化:session序列化文件恢复(session对象的内存地址一般是不同的,但sessionID不变)
(3)session销毁时间
①服务器关闭
②session对象调用 invalidate()
③浏览器超过一定时间没有发起请求
tomcat服务器 web.xml 配置文件里面有<session-config>,配置了session的默认存活时间
(4)特点
①用于一次会话里多次请求间共享数据,数据保存在服务器
②session可存储任意类型、任意大小的数据
③session相对cookie更安全

浙公网安备 33010602011771号