平常我们在浏览网页的时候,会有一些网站要求我们进行登录,当我们成功登录之后,会发现我们所浏览的所有相关网页都不再需要我们重新登录,这是为什么呢。还有当我们在电商平台进行购物的时候,我们虽然是在同一家电商平台进行购物,但是我们明明是在不同的页面进行的添加购物车的选项,为什么最后我们可以在购物车中找到我们所添加的所有商品呢。其实,这些都是我们在Web后台方面使用了Cookie技术。
Cookie简介
Cookie定义:Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。
session:会话,指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间。具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,也就是用户浏览这个网站所花费的时间。(摘自百度百科)
实现思想
如何让网站记住我们,乃至记住我们之前做过的事情,我们可以联想,如果让服务器在我们进行此次请求的时候,可以让其返回我们进行下次请求时服务器应该知道的东西给浏览器,之后当我们进行下一次请求的时候,就可以让浏览器将刚才所得的数据返回给服务器,那么服务器就有办法知道我们多次请求之间相关连的数据,也就从逻辑上打破了HTTP请求与响应的每次状态都是独立不相关的这个规则。我们就可以实现一个会话,当我们进行了登录之后,到关闭浏览器为止,我们的身份都是可以被服务器所“记住”的。
实现原理
在我们使用浏览器对服务器进行请求的时候,服务器会先给浏览器响应一个set-cookie标头,浏览器收到这个标头与数值之后,会将它以文件的形式存储在计算机上,这文件就称之为Cookie。
我们可以设定给Cookie一个存活期限,保留一些有用的信息在客户端,当我们关闭浏览器并再次打开浏览器链接服务器之后,这些Cookie仍在有效期限中,浏览器会使用cookie标头自动将Cookie发送给服务器,服务器就可以得知一些先前浏览器请求的相关信息。
URL重写
所谓URL重写,就是GET请求参数的应用,当服务器响应上一次请求时,将某些相关信息以超链接的方式响应给浏览器,超链接中包含请求参数信息。
HttpSession会话管理原理
尝试运行HttpServletRequest的getSession时,Web容器会创建HttpSession对象,关键在于每个HttpSession对象都会有个特殊的ID,称为Session ID,你可以执行HttpSession的getID来取得Session ID。这个Session ID默认会使用Cookie存储在浏览器中,在Tomcat中,Cookie的名称是JSESSIONID,数值则是getID所取得的Session ID。
Web容器本身是运行在JVM中的一个Java程序,通过getSession取得HttpSession,是Web容器中的一个Java对象,HttpSession中存放的属性,自然也就存放在服务器端的Web容器中。每个HttpSession都有一个自己的Session ID,当浏览器请求应用程序时,会将Cookie中存放的Session ID一并发送给应用程序,Web容器根据Session ID找到相对应的HttpSession 对象,这样就可以取得各个浏览器的个别会话的数据。
Web容器存储Session ID的Cookie“默认”关闭浏览器就失效,所以重启浏览器请求应用程序时,通过getSession得到的是新的HttpSession对象。
实际上,默认关闭浏览器失效的不是HttpSession,而是浏览器上的Cookie,因为Cookie失效了,所以就不能通过Cookie来发送Session ID,所以尝试getSession时,容器会产生新的HttpSession。要让HttpSession立即失效,需要使用invalidate方法,否则,HttpSession会等到设定的失效期间过后才会被容器销毁回收。
HttpSession与URL重写
当我们浏览器禁用Cookie的时候,也就是无法使用Cookie发送Session ID该怎么办,在HttpSession中,也可以搭配URL重写进行HttpSession的会话管理。我们可以使用想浏览器响应一段超链接,超链接后面附加Session ID,当用户点击超链接的时候,Session ID以GET请求发送给Web应用程序。
如果要使用URL重写的方式来发送Session ID,可以使用HttpServletResponse的encodeURL协助产生所需的URL重写,若容器能从请求中得到带有Session ID的Cookie,encodeURL就对URL没有什么作用,若容器不能从Cookie中得到Session ID则encodeURL会自动产生带有Session ID的URL重写。