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中进行配置
分钟
Timeout设置成0或者负数表示Session永久有效;
方法三:直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下
conf/web.xml中找到
只要修改这个值就可以了
企业中一般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 备注()