在上一篇文章《一文搞清楚Cookie概念和难点》中的最后,我提出cookie的一系列的问题,那么今天我们就从这个这些问题入手,看看后来之秀如何超越自己的前辈的。
一:Session的原理
上篇文章写道一个超市购物办卡的场景:
我说可以,然后录入自己的信息。带着超市的卡回家了。
这个时候超市并没有保存我的信息,所有的信息都是存储在我的卡片中(早期的购物系统是这样的),只有当我把卡带回来的时候,我消费才能够给我添加积分,如果没有带卡是积不了分的。
姑且不论设计如何,看看Session的机制就知道后者是比较优秀。
还是一个购物场景:
超市更换了一套更为高级的客户管理系统。
录入用户信息,超市会员系统会保存一份,然后给我张卡,同时告诉我记住我的卡号,下次不用带卡也可以积分。
我很开心,背下卡号,再次消费的时候就可以无卡积分了。
实现的原理:
当用户第一次访问我们的服务器的时候,我们会随机的分给用户一个JSESSIONID=C9423A308AF02F61FC93C20D91F032B0
,并且保存在用户的cookie中,同时在服务端则保存着这个session的具体信息,比如用户的登录信息。每一次访问的我们随着请求带过去,那么我们就知道本次请求时那个用户在访问。
二:Session的操作
1.客户端设置Session:
当用户第一次请求servlet的时候,相应头会告诉cookie添加一个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.
当然我们可以修改,默认值.也可以使用setMaxInactiveInterval(int interval)
,可以手动的设置session
的存活时间.
四:Cookie禁用和URL重写
Session也是通过Cookie去传递JSESSIONID
的,但是如果用户禁用了Cookie我们该怎么办呢?
1. 手动的拼接jsessionid
这也是比较原始的值传递的方式,就是在URL地址上拼接我们的 jsessionid
,将这个参数带到我们的服务器,就可以找到我们服务器相对应的session
了.
2.使用response.encodeURL(url)
让服务器自动拼接jsessionid
.
我们使用responsee.encodeURL("url")
来获取url更加方便,并且也更加的智能,当用户禁用了Cookie
的时候,我们才会把jsessionid
拼接上去,如果没有的话,我们的url
还是最简洁的方式呈现.
关于session的内容,我就整理到这里,以后也会逐渐分享自己在实际工作中session遇到的问题以及解决方案分享出来,不仅仅能够给自己提个醒,也希望能够帮助各位同学吧.