Cookie与Session
Session原理
Session可以放在文件、内存中或数据库都可以,是以键值对的形式存储。Session也是一种key-value的属性对。
当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识,称为Session ID。如果已包含一个Session ID则说明以前已经为此客户端创建过Session,服务器就按照Session ID把这个Session检索出来使用(如果检索不到,可能会新建一个,根据 getSession()方法的参数);如果客户端请求不包含Session ID,则为此客户端创建一个 session并且生成一个与此Session相关联的Session ID,这个Session ID将被在本次响应中返回给客户端保存。
Session的客户端实现形式(即Session ID的保存方法)
一般浏览器通过以下3种方式来保存Session:
- 使用Cookie来保存。 来保存,这是最常见的方法,“记住我的登录状态”功能的实现正是基于这种方式的。服务器通过设置Cookie的方式将Session ID发送到浏览器。如果我们不设置过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个Session ID就丢失了。如果我们设置这个时间,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
- URL重写。就是把Session ID直接附加在URL路径的后面,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。
- 在页面表单里面增加隐藏域。这种方式实际上和第二种方式一样,只不过前者通过GET方式发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
Session何时被创建
一个常见的错误是以为Session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletReq