JSP/Servlet||cookie属性和session属性

Cookie

cookie是服务器写给客户端响应文本中的一小段头属性,会存到浏览器的缓存或客户的一个小文本文件。默认情况下,客户端浏览器向给自己写cookie的域发请求时,cookie(小段文本)会跟着请求上传到服务器

Servlet中向客户端写Cookie的代码

//cookie是服务写到客户端的一小段文本,是服务存到客户端的数据
Cookie c1 = new Cookie("name","蔡徐坤");//创建Cookie对象
response.addCookie(c1);//写入Cookie
Cookie c2 = new Cookie("sex","M");//创建Cookie对象
Cookie c3 = new Cookie("password","1008611");//创建Cookie对象
response.addCookie(c2);//写入Cookie
response.addCookie(c3);//写入Cookie

上面的addCookie方法生成的Http响应文本中的内容如下图

上图的set-cookie头属性的值,会被浏览器存在缓存或特定位置的文本文件中

当我们向同一域发送请求时,之前写的Cookiet会跟着请求上传

上图显示的是请求头中的内容,可以看到cookie头属性中有所有我们曾经写给客户端的cookie的内容,而服务器端Servlet中取出这些cookie的代码如下 :

Cookie[] cs = request.getCookies();//取出所有上传的cookie对象
for(Cookie c : cs){//迭代
    System.out.println(c.getName() + ":" + c.getValue());//输出cookie的名字和值
}

Cookie的属性

cookie可以设置属性,最重要的属性有

  • maxAge Cookie的失效时间,以秒为单位,默认cookie是存在浏览器缓存里,关闭浏览器,cookie自然消失,设置maxAge属性后,浏览器会把cookie存储为一个文本文件,在设置的失效时间前,一直有效
c1.setComment ("name","蔡徐坤");
c1.setMaxAge (2*60);//这个代码设置了cookie的失效时间为120s

可以看到maxAge导致响应中cookie增加了很多失效时间的属性

  • path 和secure属性,这个两天属性path是设置cookie发送的路径的,cookie除了向默认域发送cookie,向path指定路径下的组件也会发送cookie,secure会在响应中添加一个secure属性

Session

session是服务器端的一个集合,可以存储任何东西。session最重要的特性,是可以识别客户。

Session的工作原理

当我们的Servlet需要使用Session时,执行下面的代码:

HttpSession session = request.getSession();//取出session
session.setAttribute("QQ1","Scoat");
request.setAttribute("QQ1","Scoat");

如果是第一次取session,服务器会创建一个session对象(session本身是一个map集合),并且存入服务器的session集合中以sessionId为标识键,也就是根据sessionId即可取到对应session的引用。同时使用sessionr Servlet还获得了一个sessionId,在响应时把这个sessionId以cookie的形式发给了客户端。如果客户访问其它同一域的Servlet,这个sessionId会跟着请求上传到服务器。那么如果请求的另一个Servlet也要使用session,会先检查有没有这个保存sessionId的Cookie,如果有则直接到session集合中取对应的session引用返回给要使用的Servlet,所以,只要客户端存在这个sessionId,不管请求哪个Servlet,都可以拿到同一个session。所以Session就可以给不同的请求存储数据。

HttpSession session = request.getSession();//取出session
session.setMaxInactiveInterval (2*60);
session.setAttribute("QQ2","Computer");
request.setAttribute("QQ2","Computer");
session.invalidate ();//销毁session

输出框

注意,request无法读取数据,session才能读取

HttpSession session = request.getSession ();//取出session
response.getWriter ().println (request.getAttribute ("QQ1"));
response.getWriter ().println (request.getAttribute ("QQ2"));
response.getWriter ().println (session.getAttribute ("QQ1"));
response.getWriter ().println (session.getAttribute ("QQ2"));

Session过期

要保证session能够跨请求存储数据必须保证下面两个条件必须满足

  • 客户浏览器不能关闭

因为session会给客户保存一个sessionId,这个id是作为临时cookie存在客户浏览器缓存当中,如果关闭浏览器,缓存就没了,sessionId自然也就消失了。重新打开浏览再请求,就是一个全新的请求,服务器会创建一个新的session,之前的session就没法用了。

  • 请求不能超过session的过期时间

服务器的session如果始终没有使用,保留着就是浪费服务器的资源,所以服务器会定期检查session的最后访问时间,如果这个时间超出session设置的过期时间,服务器就会销毁这个session,那么客户端即使把sessionId又传上来,服务器也找不到它的session了,只会再重新创建一个新的session。

Session生命周期的操作方法

session.setMaxInactiveInterval(2*60);//设置session过期时间
session.invalidate();//销毁session的方法
session.getCreationTime();//获得session的创建时间
session.getLastAccessedTime();//获得session最后一次被使用的时间

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值