javaweb03_Cookie和Session
Cookie
Cookie 是保存在客户端的键值对,它可以弥补HTTP协议无状态的不足。
服务端创建并发送Cookie对象给浏览器:
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
//设置Cookie的有效期为1天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
服务端获取Cookie:
Cookie[] cookies = req.getCookies();
Cookie有效期:
- 默认情况下,当浏览器关闭后,Cookie数据被销毁
- setMaxAge()设置Cookie有效期后,时间到了Cookie将自动失效
- 一般使用setMaxAge(0)来删除Cookie
Cookie中文字符问题:
- 在 tomcat8 之前cookie存储中文字符需要转码
//编码
Cookie cookie = new Cookie("name",URLEncoder.encode("张三","utf-8"));
resp.addCookie(cookie);
//解码
URLDecoder.decode(cookie.getValue(),"utf-8");
- 在 tomcat8 之后cookie支持中文数据的存储
单个cookie的大小上限值为4KB
浏览器存储同一个域名下的总cookie数量也有限制,不同浏览器可存储的cookie数量不同
session
Session保存在服务器上,是另一种记录客户状态的机制
当客户端第一次访问服务器时,服务器默认为每个浏览器创建不同的HttpSession对象,然后发送一个JSESSIONID给客户端
这个JSESSIONID本质上就是一个Cookie
后续客户端访问服务器时都会带上这个JSESSIONID,服务端利用 JSESSIONID 判断哪个Session属于该客户端
获取session:
HttpSession session = request.getSession();
//获取sessionid,其值就是JSESSIONID
String id = session.getId();
String name = (String) session.getAttribute("name");
设置session:
session.setAttribute("name","BLU");
设置Session的有效期:
<!-- 单位为分钟 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
手动销毁session:
session.invalidate();
问题:当浏览器关闭后,JSESSIONID就会消失,再次访问的时候又重新创建了一个新的session对象。这样比较消耗资源。
解决办法:手动创建JSESSIONID并手动设置其有效期:
HttpSession session = request.getSession();
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setMaxAge(60*30);
response.addCookie(cookie);
思考:如果没有cookie,session如何工作?‘
如果浏览器把cookie功能关闭,那么服务端就无法获取jsessionid,每一次访问,都会生成一个新的session对象。
解决办法:
<a href="<%=response.encodeURL("hello.jsp")%>">hello</a>
当客户端cookie被禁用时,response.encodeURL方法会把jsessionid存入地址栏: