闲聊cookie与session

Session

session是一种位于服务端,用于存储一个会话(指打开浏览器访问某个域名,及其下面的资源,然后关掉浏览器的过程)中所需的配置信息。也就是在一个会话中,只存在一个session。对于java web编程来说,session就是在request.getSession()创建的。同样,session也可以通过setMaxInactiveInterval()设置其最大闲置时间(默认为30分钟,可以通过tomcat管理员登录观察)。

session的结构类似一个map。可以根据需求put不同的key和value进去。通常,用作登录状态的保持(这样需要session跟踪,后面会说到),可以减少多次登录困扰。

用Java代码体验下这一过程:

PrintWriter writer = response.getWriter();
HttpSession session = request.getSession();
// 设置session有效时间为1天
session.setMaxInactiveInterval(60 * 60 * 24);
if (session.isNew()) {
    session.setAttribute("name", "cjt");
    writer.write("新建Session成功");
} else {
    writer.write(session.getAttribute("name").toString());
}

每个会话第一次与服务端产生交互,请求头Request Header是不包含任何cookie的,所以跟踪不到session,isNew()返回true;然后在同一次回话中,接下来的访问都返回false,调试看看很明显:

这里写图片描述

对于tomcat容器来讲,getSession()默认会生成一个id为JSESSIONID的session,然后set-cookie保存到客户端(会话cookie),但是session默认最大闲置时间是30分钟,所以第二次会话时上次的名为JESSIONID的cookie会丢失,但是session还存在服务器端。

cookie是指为了辨别身份、进行 session 跟踪而储存在本地终端上的数据(通常经过加密),也可以叫做浏览器缓存。cookie是由服务端发出set-cookie指令,客户端根据设置的cookie信息创建本地cookie。

一个cookie可看做一个实体类,里面存有当前cookie的name、value、maxage、path等。在访问path路径及其子路径时,会封装一系列相关的cookie集合到Request Header中,发送到服务器。

具体java代码就是在服务端完成,记住创建了cookie对象后要添加到response中:

// 设置临时Cookie,只存在一次会话中,默认值
Cookie tempCookie = new Cookie("temp", "tempCookie");
tempCookie.setMaxAge(-1);
response.addCookie(tempCookie);
// 设置瞬时Cookie,浏览器收到Cookie立即删除
Cookie cookie = new Cookie("cookie", "666");
cookie.setMaxAge(0);
response.addCookie(cookie);
// 设置常驻Cookie
Cookie userCookie = new Cookie("user", "cjt");
userCookie.setMaxAge(60 * 60 * 24);
response.addCookie(userCookie);

在火狐下通过开发者调试可以看到:

这里写图片描述

敲黑板!!重点是响应头(Response Header)里面的Set-Cookie,这里面可以看到设置的三个cookie。然后通过浏览器cookie查看:

这里写图片描述

瞬时cookie已经删掉了,会话cookie和常驻cookie还在,可以关掉浏览器,再次访问该路径查看cookie,这是就只有设置的常驻cookie了。

特别注意

在实际开发中,可能需要我们手动更改cookies的内容,那么cookie并不提供update,只有add方法。这里就要采取覆盖的方式更新了。

举个例子,你把购物车的信息都在cookie key为cart的本地常驻cookie中,然后添加了商品到购物车,这里就要更新该cookie。重点就在这里,java里面获取到key为cart的cookie,你会发现只能取到里面的key和value,path和maxage都获取不到,具体原因我也不清楚。

如果此时强行采取添加覆盖的方式,就会增加了一个会话cookie到客户端。而之前的常驻购物车cookie并没有改变。所以得每次手动设置path和maxage为了和之前保持一致,这样才能达到更新的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值