Session是通过利用设置在Cookie中的id来区分访问的用户

面试的时候被问到 了Session是通过什么区分每一个用户,现参照了网上内容整合并做了部分修改做一个详细的解读


1、当使用下面这句创建session的时候,

HttpSession session = request.getSession(true);//或者使用request.getSession();意思一样

服务器每创建一个session都会有一个相对应的sessionId(SessionID的本质),并且服务器会把这个sessionId,会以Cookie的形式回写给客户端(浏览器),下次同一个用户访问的时候会带这个sessionId属性。有时候就会出现一个问题,如果不小心关闭了客户端(浏览器),那么Cookie就不存在了。

例如常见的购物车功能,在购物的时候,不小心关闭了浏览器,该用户下次再来访问的时候,上次的记录就不存在了,所以当session创建的时候,可以把对应创建的sessionId存到一个设置有效期的的Cookie当中,那么在你关闭浏览器的时候,在较短时间内,再次打开浏览器,上次的浏览记录依然还是在的。

可以通过以下代码可以去实现:

HttpSession session = request.getSession(true);
session.setAttribute("key", "value");
String sessionId = session.getId();	  

Cookie setSessionId = new Cookie("mySessionId",sessionId);//sessionId默认是存放在一个name为mySessionId里面的
setSessionId.setPath("上次路径");
setSessionId.setMaxAge(30 * 60);// 以秒为单位,所以为30分钟
response.addCookie(setSessionId);

说到这先讨论一个新的问题:

有些网站使用Session ID来记录用户,每个用户访问网站时都会生成独特唯一的Session ID,加在URL中。网络爬虫的每一次访问也会被当成一个新的用户,URL中会加上一个不同的Session ID,这样网络爬虫每次访问时所得到的同一个页面的URL,后面会带着一个不一样的Session ID。这也是最常见的爬虫陷阱之一。 搜索引擎遇到这种常常的Session ID,会尝试判断字符串是Session ID还是正常参数,成功判断出Session ID就可以去掉Session ID,收录正常URL。但也经常判断不出来,要么不愿意收录,要么收录多个带有不同Session ID的URL,内容却完全一样,形成大量复制内容,这两种情况对网站优化都不利。


2、回到正题,为什么我上面这段代码设置了Cookie的生命周期,再次打开浏览器的时候,这个Cookie还在呢;而当你创建session并且默认以Cookie的形式回写给客户端的时候,不小心关闭了浏览器,再次打开的时候Cookie却不存在了?
下面是关于Cookie生命周期的介绍:
Cookie如果不设置过期时间(使用setMaxAge()方法),则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。

如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器还有不同的处理方式。


维尼聚合工具


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值