Session 原理:
session可以放在文件、内存中或数据库都可以,是以键值对的形式存储。Session也是一种key-value的属性对。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为session-id,如果已包含一个session id,则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,根据getSeesion()方法的参数),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关连的session id,这个session id将被在本次响应中返回给客户端保存。
Session的客户端实现形式(即session id 的保存方法)
一般浏览器提供了3种方式来保存:
【1】使用Cookie来保存。这是最常见的方法,“记录我的登录状态”功能的实现正是基于这种方式的。服务器通过设置Cookie的方式将session id 发送到浏览器。如果我们不设置过期时间,那么这个Cookie将不存放在硬盘上,当浏览器关闭的时候,Cookie就消失了,这个session id就丢失了。如果我们设置这个时间,那么这个Cookie会保存在客户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同样会发送到服务器上。
【2】URL重写,就是把session id直接附加在URL路径的后面,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。
【3】在网页表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方法发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
就是服务器会自动修改表单,添加一个隐藏字段,一边在表单提交时能够把session id传递回服务器。比如:
1 <form name="testform" action="/xxx">
2 <input type="hidden" name="jsessionid"
3 value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBug!-145788764">
4 <input type="text">
5 </form>
session什么时候被创建?
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。
session何时被删除?
session在下列情况下被删除:
A. 程序调用HttpSession.invalidate()
B. 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C. 服务器进程被停止
再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。
getSession()/getSession(true)、getSession(false)的区别
getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象。
getSession(false):当session存在时返回该session,否则不会新建session,返回null。
Cookie 的机制:
Cookie的种类:
1、以文件方式存在硬盘空间上的永久性的cookie。持久cookie是指存放于客户端硬盘中的cookie信息(设置了一定的有效期限),当用户访问某网站时,浏览器就会在本地硬盘上查找与该网站相关联的cookie。如果该cookie存在,浏览器就将它与页面请求以期通过HTTP报头信息发送到您的站点,然后在系统会比对cookie中各属性和值是否与存放在服务器端的信息一致。并根据比对结果确定用户为“初访者”或“老客户”。
2、停留在浏览器所占内存中的临时性的cookie,关闭 Internet Explorer 时即从计算机上删除。
Cookie 的有效期:
Cookie的maxAge决定着Cookie的有效期,单位为秒。
如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。
1 Cookie cookie = new Cookie("username","helloweenvsfei");//新建Cookie
2 cookie.setMaxAge(Integer.MAX_VALUE);//设置生命周期为MAX_VALUE
3 response.addCookie(cookie);//输出到客户端
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为-1.
如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。
例如:
1 Cookie cookie = new Cookie("username","helloweenvsfei");//新建Cookie
2 cookie.setMaxAge(0);//设置生命周期为0,表示删除cookie
3 response.addCookie(cookie);//必须执行这一句
Cookie的组成部分
Cookie在HTTP的头部信息中。
标准格式:Set-Cookie:NAME=VALUE; Expires=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE;
举例说明:Set-Cookie:JSESSIONID=mysession; Expires=Thu; 05-Jun-20 08 05:02:50 GMT; Path=/web;
Cookie的Expires属性标识了Cookie的有效时间,当Cookie的有效时间过了之后,这些数据就被自动删除了。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命周期为浏览器会话期的cookie被称为会话cookie(临时性cookie),会话cookie保存在内存里。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。
Cookie被浏览器禁用怎么办?
cookie可以被人为地禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递会服务器。
【1】URL重写,就是把session id直接附加在URL路径的后面,也就是像我们经常看到JSP网站会有aaa.jsp?JSESSIONID=*一样的。
【2】在网页表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过GET方法发送数据,后者使用POST方式发送数据。但是明显后者比较麻烦。
就是服务器会自动修改表单,添加一个隐藏字段,一边在表单提交时能够把session id传递回服务器。比如:
1 <form name="testform" action="/xxx">
2 <input type="hidden" name="jsessionid"
3 value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBug!-145788764">
4 <input type="text">
5 </form>
Cookie 与 Session的区别
1、cookie数据存放在客户端,用来记录用户信息的,session数据放在服务器上。
2、正是由于Cookie存储在客户端中,对客户端是可见的,客户端的一些程序可能会窥探、复制甚至修改Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的危险。
如果选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只有自己能读得懂。而如果选择Session就省事多了,反正是放在服务器上,Session里任何隐私都可以。
3、Session是保存在服务器端的,每个用户都会产生一个Session。如果并发访问的用户非常多,会产生非常多的Session,消耗大量的服务器内存。因此像Google、Baidu这样并发访问量极高的网站,是不太可能使用Session来追踪客户会话的。
而Cookie保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,Cookie是很好的选择。
4、cookie的容量和个数都有限制。单个cookie的容量不能超过4KB,很多浏览器都限制一个站点最多保存20个cookie,而session没有此问题。
5、所以建议:将登录信息等重要信息存放到SESSION中,其他信息如果需要保留,可以放在COOKIE中。
Session 和 Cache 的区别
Session是但用户的会话状态。当用户访问网站时,产生一个SESSIONID。并存在于COOKIES中。每次向服务器请求时,发送这个COOKIES,再从服务器中检索是否有这个SESSIONID保存的数据。而cache则是服务器端的缓存,是所有用户都可以访问和共享的。因为从Cache中读数据比较快,所以有些系统(网站)会把一些经常被使用的数据放到Cache中,提高访问速度,优化系统性能。
如果有几千个session,怎么提高效率?(当session访问量比较大的时候,怎么解决?)
把session放到redis或memcache等此类内存缓存中或把session存储到SSD硬盘上。