cookie和session的使用

什么是Cookie:

即解决用户的会话跟踪.

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

Cookie的操作:

1:创建Cookie对象并设置共享数据[办一张会员卡,并填写卡上的信息. 【要导入相应的包才能创建,这个可以去百度查API找找】  

Cookie  c = new Cookie(String name,String value);  

Cookie c = new Cookie("currentName","Will");  

   

参数:    
 

name:  给共享数据起个名字       

value: 多个请求之前需要共享的数据

2:把Cookie放入响应中,响应给浏览器

response对象.addCookie(c); 

3:从请求中获取Cookie对象,再从Cookie中获取共享的数据   

Cookie[] cs = req.getCookies();

4:Cookie的属性名和属性值都不支持中文.    

解决方案:URLEncoder对中文做编码操作.    编码(放进Cookie之前):  设置为utf-8      

Cookie  cookie = new Cookie("currentName",URLEncoder.encode(username, "UTF-8"));    

解码(从Cookie中获取出来):  

username = URLDecoder.decode(c.getValue(), "UTF-8");

5:修改Cookie(修改Cookie中存放的共享数据).    

方式1:获取被修改的Cookie对象,cookie对象.setValue(新的数据)(不推荐);    

方式2:创建一个和被修改Cookie同名的Cookie对象,只改变value值即可.      

Cookie xxx = new Cookie("currentName","lucy");    

注意:此时修改重新把修改之后的Cookie响应给浏览器.

6:Cookie的分类(根据Cookie存活的时间,分成两大类).    

会话Cookie:在当前会话中有效,浏览器关闭就销毁了.此时该Cookie存放在浏览器进程中(缺省).  

 持久化Cookie:可以存活指定的时间(我们需要来设置Cookie的存活时间).    

设置Cookie对象存储的最大时间.:

Cookie对象.setMaxAge(int seconds);

7:删除Cookie.  

 Cookie对象.setMaxAge(0):表示立刻删除该Cookie对象. 

8:设置访问路径和域.  

Cookie的path是在同一主机中指定共享Cookie,如果主机不同那么就一定不能共享Cookie,无论path是什么。

  需求:AServlet和BServlet共享Cookie:    

如果:AServlet的资源路径是/cookie/a,BServlet的资源路径是:/cookie/b. 此时共享成功.    

如果:AServlet的资源路径是/cookie/a,BServlet的资源路径是:/ooxx/b.   此时不能共享.    

默认情况下会根据Servlet的相对路径来做判断.    

若需要让整个应用中所有的Servlet都可以获取该Cookie,则设置为:Cookie对象.setPath("/");         如果希望不同的二级域名中可以共享Cookie,那么就要设置Cookie的domain了。   例如:music.baidu.com、map.baidu.com、tieba.baidu.com,它们的域名不同,但百度希望它们之间可以共享Cookie,那么就要设置domain了。

Cookie的缺陷:    

1:Cookie存储中文的时候,操作麻烦(手动的编码/解码操作);  

 2:Cookie存储在浏览器中,多个人使用共同的一台的电脑的时候,不安全.  

 3:Cookie的文件大小和数量是有限制的.        

Cookie大小限制在4KB之内;        

一台服务器在一个客户端最多保存20个Cookie;        

一个浏览器最多可以保存300个Cookie;    

4:Cookie的value只能存储String类型的数据,一个Cookie只能存储一个共享数据.      

若需要共享多个数据,就得创建多个Cookie对象,操作起来比较麻烦      

如果Cookie的Value可以存储Object类型,我们就可以把多个数据封装成对象,再做存储.  

 5:Cookie在设计上的问题.        

Cookie的设计:把客户端和服务端的识别数据存放于客户端中,这个在设计上有点不合理.        

最好的设计方式:把识别数据存放于服务端,客户端只需要存储一个标志即可.        

 

什么是Session:

Session是服务器端技术(把识别数据/共享数据存放于服务端),利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Session其实就是一个特殊的会话Cookie,浏览器关闭Session就销毁了

操作Session:

1:创建和获取Session对象.  

 HttpSession session  = request对象.getSession(true);                

  如果当前存在Session对象,则直接返回,如果当前没有Session对象,先创建一个Session对象,再返回.    

HttpSession session  = request对象.getSession(false); 

 如果当前存在Session对象,则直接返回,如果没有,在则返回null.    

HttpSession session  = request对象.getSession();

等价于 request对象.getSession(true).

2:往Session中存储共享数据.

 session对象.setAttribute(String name,Object value);      

一般情况下,存储在session中的属性起名为:XXX_IN_SESSION.      

1:因为Session的setAttribute方法支持Object类型,所以我们可以把多个共享数据封装成对象,再存储到session中.  

 session.setAttribute("USER_IN_SESSION",user对象);      

2:一般的,为了多态服务器之间共享session中的数据,我们把session中的对象实现java.io.Serializable接口.        

当某一个对象只有实现java.io.Serializable接口之后,才可以做序列化操作.        

序列化:  把对象的数据以二进制的形式存储到文件中.-相当于网络传输.        

反序列化:  把二进制形式的数据恢复成Java对象.

3:获取Session中存储的数据.    

Object value = session对象.getAttribute(String name); 

4:删除Session(删除Session中存储的共享数据)[登录注销]:  
 

方式1:session对象.remove(String name);从当前session中删除指定属性名的属性.    

方式2:session.invalidate();销毁session对象,从而session中的数据全部没了. 

5:Session的超时管理.    

超时时间:用户的两次操作的最大间隔时间:超时时间到了,就会销毁Session.    

session对象.setMaxInactiveInterval(int seconds):   

 一般说来:不用设置,Tomcat中默认为30分钟.

6:URL重写.    

Session其实也就是一个会话Cookie(浏览器关闭之后,浏览器存储的jsessionid消失了,session对象在服务端依然存在).    

浏览器可以禁用Cookie(不接受Cookie),不推荐使用,操作相当麻烦.    

解决方案:手动的在每一个资源后面携带:;jsessionid= session的id值.    http://localhost/session/get  

因为浏览器没有存储session的id值,所以找不到服务端的共享数据内存地址.    http://localhost/session/get;jsessionid=FACF8BD9AFB39C1A85A1B1FDC1978923 .    

URL重写:  
 

String newUrl =     response对象.encodeURL(String oldUrl);    

String newUrl =     response对象.encodeURL("session/get");

返回:/session/get;jsessionid=FACF8BD9AFB39C1A85A1B1FDC1978923

解决用户的会话跟踪问题(实现多个请求之间共享数据):

Cookie: 客户端技术:把共享数据存储在浏览器中. Session:服务端技术:把共享数据存储在服务端,只是给了客户端一个地址(jesseionid). 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值