Java架构实践-session和cookie的区别?

Cookie和Session

一、会话技术

 

问题引入:一个购物网站系统(比如:淘宝网),用户都会把想要购买的物品放到购物车中,你会发现用户一旦放入购物车,无论用户点击到那一个页面添加到购物车的商品都能看到(有的网站不登陆也能查看购物车信息),那么这个是怎么实现的呢?


因为Http协议是无状态的(没有记忆功能,提高了传输效率),也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以要完成上面的要求就必须要使用会话技术了。


1. 什么是会话技术

会话技术指的是当一个浏览器与服务器在进行对话的期间(即浏览器没有关闭),各个请求不同的页面间可以共享数据,这种技术就称之为会话技术。

从浏览器请求某个网站,直到浏览器关闭,称为一次会话。会话技术就是解决用户数据的保存问题。


2 . 会话技术分类

   会话技术主要分为Cookie和Session两种技术;

Cookie数据存储在客户端本地(此处我们是浏览器上),减少服务器端的存储的压力,安全性不好,客户端可以清除cookie;

Session将数据存储到服务器端,安全性相对好,增加服务器的压力;


二、Cookie技术

Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习:

   第一,服务器端怎样将一个Cookie发送到客户端;

   第二,服务器端怎样接受客户端携带的Cookie;


1. 服务器端向客户端发送一个Cookie

 1)创建Cookie

Cookie cookie = new Cookie(String cookieName,String cookieValue);

示例:

Cookie cookie = new Cookie("username","zhangsan");

resp.addCookie(cookie);

那么该cookie会以响应头的形式发送给客户端。

 注意:Cookie中存储中文时,放入cookie要使用URLEncoder.encode进行编码,获取cookie时要通过URLDecoder.decode进行解码出来,不然会出现乱码问题。


2)设置Cookie在客户端的持久化时间

cookie.setMaxAge(int seconds); ---时间秒

注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里。


示例:

cookie.setMaxAge(10*60);

设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器自动删除该cookie信息


3)设置Cookie的携带路径

cookie.setPath(String path);

注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

示例:

cookie.setPath("/WEB16");

代表访问WEB16应用中的任何资源都携带cookie

cookie.setPath("/WEB16/cookieServlet");

代表访问WEB16中的cookieServlet时才携带cookie信息


4)向客户端发送cookie

response.addCookie(Cookie cookie);


5)删除客户端的cookie:

setMaxAge(0);

注意:只是删除本地cookie文件,浏览器还有缓存,需要关闭浏览器再打开;


2. 服务器端怎么接受客户端携带的Cookie

cookie信息是以请求头的方式发送到服务器端的。

1)通过request获得所有的Cookie:

Cookie[] cookies = request.getCookies();

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie


for(Cookie cookie : cookies){

if(cookie.getName().equal(cookieName)){

String cookieValue = cookie.getValue();

}

}


三、Session介绍

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID


使用Session即就要思考下面三个问题:

怎样获得属于本客户端的session对象(内存区域)?

怎样向session中存取数据(session也是一个域对象)?

session对象的生命周期是怎么样的?


四、Session的使用

1.获得Session对象

HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了);


Session一旦创建会自动创建一个对应的JSEESIONID,存储在Cookie中;

JSEESIONID与Session的关系:

钥匙(或密码)与银行保险箱,钥匙(或密码)在客户端,保险箱在服务器端 ;


2.怎样向session中存取数据(session也是一个域对象)

Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

setAttribute(String name,Object obj);

getAttribute(String name);

removeAttribute(String name);


3.Session对象的生命周期

(1). Session的创建

第一次执行request.getSession()时创建

(2). Session的销毁:

1)服务器(非正常)关闭时

2)过期/失效(默认失效时间30分钟)

session的过期时间是从什么时候开始计算的?

从Session不活动开始计时;

即没有任何的跟服务器页面或者Servlet交互了;

 方法一:可以通过代码设置Session的失效:

 session.setMaxInactiveInterval(100);              


 方法二: 在工程的web.xml中进行配置

        30

分钟


Timeout设置成0或者负数表示Session永久有效;


方法三:直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下

conf/web.xml中找到元素,tomcat默认设置是30分钟,

只要修改这个值就可以了


企业中一般Session的有效期是一周

3)手动销毁session

session.invalidate();


作用范围:

默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象 。


4. 如何判断Session是否过期

getSession(boolean create);

API说明: 返回与此请求关联的当前 HttpSession,如果没有当前会话并且 create 为 true,则       返回一个新会话。 如果 create 为 false 并且该请求没有有效的 HttpSession,则此方法返回

null。


        由API说明可知,通过以下方式可以知道Session是否过期:


if(request.getSession(false)==null){  

   System.out.println("Session has been invalidated!");  

}else{  

    System.out.println("Session is active!");  



特殊情况:第一次访问时候也是null,因为第一次之前还没有创建Session;



三、Session和Cookie的区别

 

1 .存取方式的不同

Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。  Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。

而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session  中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是 一个Java容器类。

 2 .隐私策略的不同

Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正 Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。

假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像   Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人  能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的   保护。

 3.有效期上的不同

使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问   都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选   择。只需要设置Cookie的过期时间属性为一个很大很大的数字。

由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需    关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写  也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致 内存溢出。

 4.服务器压力的不同

Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生   十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不   太可能运用Session来追踪客户会话的。

而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关   于Google、Baidu、Sina来说,Cookie或许是唯一的选择。

 5 .浏览器支持的不同

Cookie是需要客户端浏览器支持的。假如客户端禁用了Cookie,或者不支持Cookie,则会话跟踪会失   效。关于WAP上的应用,常规的Cookie就派不上用场了。

假如客户端浏览器不支持Cookie,需要运用Session以及URL地址重写。需要注意的是一切的用到 Session程序的URL都要进行URL地址重写,否则Session会话跟踪还会失效。关于WAP应用来说,   Session+URL地址重写或许是它唯一的选择。

假如客户端支持Cookie,则Cookie既能够设为本浏览器窗口以及子窗口内有效(把过期时间设为–1), 也能够设为一切阅读器窗口内有效(把过期时间设为某个大于0的整数)。但Session只能在本阅读   器窗口以及其子窗口内有效。假如两个浏览器窗口互不相干,它们将运用两个不同的Session。(IE8   下不同窗口Session相干)

 6.跨域支持上的不同

Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”    为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、   Sina等。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。

仅运用Cookie或者仅运用Session可能完成不了理想的效果。这时应该尝试一下同时运用Cookie与 Session。Cookie与Session的搭配运用在实践项目中会完成很多意想不到的效果。

需要获取海量最新BATJ视频资料加群:676279635 备注()

你可能感兴趣的:(Java架构实践-session和cookie的区别?)