javaweb03_Cookie和Session

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存入地址栏:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/BLU_111/article/details/108702111