Cookie-Session
会话:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话
Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Cookie存储位置
如果设置了Expires过期时间,那Cookie存储在硬盘上,如果没有设置,则存储在内存中,随着浏览器的关闭而消亡。
Win7上Cookies硬盘上的位置:
Cookie: C:/Users/[user name]/AppData/Roaming/Microsoft/Windows/Cookies/
C:/Users/[user name]/AppData/Roaming/Microsoft/Windows/Cookies/Low/
其中的部分文件夹,操作系统给隐藏掉了,可直接输入地址来查找。
HttpSession
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。 Session和Cookie的主要区别在于: Cookie是把用户的数据写给用户的浏览器。 Session技术把用户的数据写到用户独占的session中。 Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
Java Servlet中的域对象
request,response对象针对每个用户的每次请求:每次请求都会重新创建这两个对象,所以这两个对象不能存储全局变量,可以用到的地方是请求转发,可以将本次请求的request对象传递到下一次。
Servlet,ServletContext对象针对所有用户的所有请求,网站的第一个人访问的时候就会创建这些对象,之后会一直存在,知道服务器关闭。所以ServletContext可以存储全局信息,但是是针对所有用户的,比如网站访问量计数功能就可以使用该对象。缺点是所有对象都可以访问到。
Cookie,Session对象针对每个用户的所有请求,当我们使用request.getSession()得到HttpSession对象时,服务器就会为它分配一个ID,然后每个用户自己的信息就存放到了不同的HttpSession对象中,响应返回,服务器将用户Session对象的ID以Cookie形式来保存,例如:
Cookie:JSESSIONID=2DB77EDB2964DFC61828ECBCC8076258
这样,浏览器每次请求服务器都会带上此Cookie来告诉服务器,嗨,老兄,ID为这个的HttpSession对象是我的,我要取出里面的信息。
流程:
1 第一次访问服务器的时候,会在响应头里面看到Set-Cookie信息(只有在首次访问服务器的时候才会在响应头中出现该信息)
2 以后的每次请求,请求头中都会有此Cookie发给服务器
问题:
Session默认是需要Cookie支持的,但有些客户浏览器是关闭Cookie的,那我们是不是就无法使用Session了?
解决:
URL重写功能,为了防止一些用户把Cookie禁止而无法使用session而设置的功能。当检测到浏览器禁用Cookie时,将sessionid添加到URL后面,以此实现传到服务端的目的,这样无需cookie也可以使用session.
形式:
http://localhost/Web/B;jsessionid=2DB77EDB2964DFC61828ECBCC8076258?name=zz
jessionid通过这样的方式来从客户端传递到服务器端,从而来标识session。注意一点,jsessionid跟一般的url参数传递方式是不同的,不是作为参数跟在?后面,而是紧跟在url后面用;来分隔。这样在用户禁用cookie的时候我们也可以传递jsessionid来使用session了.
Session非活动时间:默认30分钟失效。
void setMaxInactiveInterval(int interval);
网站退出时应销毁所有Session。
void invalidate();
getSession()内部执行原理:
第一次request.getSession(),创建本次会话对象。
每次请求的request对象不同,但是request.getSession()得到的会话对象是同一个。
问题:
服务器如何判断getSession()是创建还是得到?
解决:
当创建了会话对象,服务端添加Cookie:sessionId=值,以后浏览器的请求都会带着这个Cookie,服务端以此Cookie来判断它是否已经创建了会话对象。
注意:
这里的sessionId只是个概念,寓意:标识会话的唯一值,在Tomcat中是JSESSIONID,在其它服务器,框架可能设置其它名字。
request.getSession()等价于request.getSession(true),true的意思为:已经存在Session对象了,返回已存在对象。如果没有Session对象,则会创建新对象。
序列化:
Tomcat的Work工作目录存储对象序列化,存储到了SESSION.ser文件。
在HttpSession中存储的对象应该实现序列化接口,这样当服务器关闭,在重启之后,HttpSession中的数据也不会消失。