Session和Cookie基础

1.什么是cookie?

由于http是短连接,因此对于服务器来说,无法得知这次来访问的用户是不是上一次访问的用户,这种情况下如果想将用户高频使用的一些数据进行存储就会比较困难,会带来一些困扰,比如对每个用户访问的高频数据进行缓存就存在困难,因为缓存了数据却无法确定数据是哪个用户相对应,cookie在一定程度上解决了服务器识别用户的困难,原理就是在用户第一次访问服务器时,服务端除了返回请求的资源,同时也返回了一些键值对给浏览器,浏览器就会将这些键值对保存起来,在用户下一次访问服务器时,请求中会带上这些键值对信息,服务器自然就可以根据这些数据识别用户。

2.cookie时如何工作的?

简单体会cookie的使用:

Cookies[] cookies=request.getCookies();
for(Cookie cookie:cookies){
    String str1=cookie.getName();
    String str2=cookie.getValue();
    System.out.printIn(“{0},{1}”,str1,str2);
}
response.addCookie(“userName”,”admin”);

cookie是以键值对的形式存数数据,且一个cookie只能存储一条用户自定义的数据,创建的cookie对象最后会被构造成字符串放入一个名为Set-Cookie的返回头中,每创建一个cookie时,就会构建出一个名为Set-Cookie的Header对象,并且这些header对象在最后会在构建返回字节流时被顺序写出,浏览器接收时也是按照顺序进行解析,因此返回头中可能会存在多个Set-Cookie,返回体中的Set-Cookie格式如下:

Set-Cookie:  name=value [ ;expires=date][ ;domain=domain][ ;path=path][ ;secure]其中name和value使用户自定义的键值,方括号中的为cookie的相关属性信息,属于可无项。

1.3 cookie的限制

浏览器对于cookie的存储数量和大小是有限制的,比如谷歌浏览器中的cookie是每个域名限制的cookie个数不能超过50,总大小不超过80000字节,此外cookie把用户相关数据存储在http头中,有安全隐患。

1.4 理解session

浏览器和服务器可以利用cookie传递多个键值数据来识别访问的用户,但如果需要的cookie值较多,首先会出现浏览器端cookie无法满足需求的问题,再者是增加浏览器与服务器间的数据传输量,如果每次交互只是传输一个能够代表某些信息的ID,服务器拿到这个ID,就能够根据ID找到用户的相关信息,同样能够达到识别访问用户的目的,而session就解决了这个问题,浏览器端的cookie保存的只是名为JSESSIONID的一个cookie。

1.5 session如何工作

在服务端request.getSession()方法第一次触发的时候,创建一个HttpSession对象,对象可以存储一些用户信息,并创建一个cookie存储JSESSIONID,创建的HttpSession对象放会被入session容器中保存,当下次用户带着存储JSESSIONID的cookie再次访问服务器时,getSession会根据cookie中相应的从session容器中找到对应的httpsession对象,一般一个session对象就对应一个用户。

HttpSession对象是保存在session容器中,容器一般由服务器端软件提供,比如在tomcat中由org.apache.catalina.Manager的实现类StandardManager来管理所有的session对象,当servlet容器关闭时,StandardManager会将所有的HttpSession对象持久化到“sessions.ser”文件中,当servlet容器重启时,会再次读取这个文件解析所有的session对象并保存到StandardManager的session集合容器中,对于session要注意设置合适的过期时间,防止session越积越多,一般在服务器软件中的xml配置文件中就可以设置session的有效时间。

猜你喜欢

转载自www.cnblogs.com/wangdamao/p/13174690.html