在上一篇文章《一文搞清楚Cookie概念和难点》中的最后,我提出cookie的一系列的问题,那么今天我们就从这个这些问题入手,看看后来之秀如何超越自己的前辈的。

一:Session的原理

上篇文章写道一个超市购物办卡的场景:

我说可以,然后录入自己的信息。带著超市的卡回家了。

这个时候超市并没有保存我的信息,所有的信息都是存储在我的卡片中(早期的购物系统是这样的),只有当我把卡带回来的时候,我消费才能够给我添加积分,如果没有带卡是积不了分的。

姑且不论设计如何,看看Session的机制就知道后者是比较优秀。

还是一个购物场景:

超市更换了一套更为高级的客户管理系统。

录入用户信息,超市会员系统会保存一份,然后给我张卡,同时告诉我记住我的卡号,下次不用带卡也可以积分。我很开心,背下卡号,再次消费的时候就可以无卡积分了。

实现的原理:

当用户第一次访问我们的伺服器的时候,我们会随机的分给用户一个JSESSIONID=C9423A308AF02F61FC93C20D91F032B0,并且保存在用户的cookie中,同时在服务端则保存著这个session的具体信息,比如用户的登录信息。每一次访问的我们随著请求带过去,那么我们就知道本次请求时那个用户在访问。

二:Session的操作

1.客户端设置Session:

当用户第一次请求servlet的时候,相应头会告诉cookie添加一个JSESSIONID:

响应中头告诉请求应该设置一个JSESSIONID

2. 服务端获取Session

使用request. getSession() :返回请求的Session对象,如果request中没有Session信息,name就会返回一个Session给客户端。

3.往Session中存储数据

session.setAttribute(String name, Object value);
session.setAttribute("username", "cunkoudelaowang");

属性名是一个字元串,而存储的对象则可以是一个对象。相对于cookie更加方便我们的存储.

4.从Session中移除数据.

session.removeAttribute(String name);

session.removeAttribute("username");

5.获取Session中的数据.

Object obj = session.getAttribute(String name);

session.getAttribute("username")

三:Session的一些细节

1.Session的命名规范:

一般的情况下我们都会使用字母大写,多个字母使用_相连:

EMPLOYEE_INSESSION,USER_IN_SESSION等.

2.Session的储存内容:

刚才我们也看了,在设置session属性的时候,我们存储的是Object对象,也就是说我们可以储存对象,这对我们开发者提供了更多方便.

//在session中存储User对象
session.setAttribute("USER_IN_SESSION", User);

3.Session的销毁和删除:

Session是存储在服务端的,removeAttribute("key")只是删除了该session的key对应的属性值,但是Session依然存在于服务端.

Session的销毁则是在服务端删除Session空间.

当浏览器关闭的时候JSESSIONID就会被删除,再次访问的时候,我们就会获得一个全新的session, 但是上一个session 依然在我们的内存中,只有当自己生命周期结束后才会删除.

4.Session的生命周期:

伺服器管理Session的生命周期,默认是30分钟,就是当你在伺服器没有活动开始计算,30分钟之后,伺服器删除对应的Session.

设置Session的过期时间

当然我们可以修改,默认值.也可以使用setMaxInactiveInterval(int interval) ,可以手动的设置session的存活时间.

四:Cookie禁用和URL重写

Session也是通过Cookie去传递JSESSIONID的,但是如果用户禁用了Cookie我们该怎么办呢?

Google浏览器上禁用Cookie

1. 手动的拼接jsessionid

这也是比较原始的值传递的方式,就是在URL地址上拼接我们的 jsessionid ,将这个参数带到我们的伺服器,就可以找到我们伺服器相对应的session了.

2.使用response.encodeURL(url)让伺服器自动拼接jsessionid.

自动拼接jsessionid

我们使用responsee.encodeURL("url")来获取url更加方便,并且也更加的智能,当用户禁用了Cookie的时候,我们才会把jsessionid 拼接上去,如果没有的话,我们的url还是最简洁的方式呈现.

关于session的内容,我就整理到这里,以后也会逐渐分享自己在实际工作中session遇到的问题以及解决方案分享出来,不仅仅能够给自己提个醒,也希望能够帮助各位同学吧.

推荐阅读:

相关文章