Cookie和Session

会话技术

概念:会话就是客户端与服务器之间的一个通信过程,一次会话中包含多次请求和响应
一次会话:客户端第一次请求服务器时建立会话,直到任意一方断开为止
作用:在一次会话的范围内的多次请求之间可以实现数据的共享
分类:
1. 客户端会话技术:Cookie
2. 服务端会话技术:Session

Cookie

为什么会有Cookie

HTTP协议是无状态的,无状态的意思是:一旦数据提交完成后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接。

服务器没法确认用户的信息,W3C提出:给每一个用户都发一个通行证,无论谁访问的时候,都需要携带通行证,这样服务器可以从通行证上确认用户的信息。通行证就是cookie。

概念

客户端会话技术,它将数据存储到客户端(浏览器)

方法:
1. new Cookie(String name,String value):创建Cookie对象,将两个参数形成键值对绑定到当前Cookie对象中
2. response.addCookie(Cookie cookie):发送Cookie对象给客户端
3. request.getCookies():获取Cookie对象数组
Cookie的流程

cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就是用response向浏览器发送一个cookie,浏览器会把cookie保存起来,当浏览器再次访问服务器的时候,浏览器会把请求的网址连同cookie一同交给服务器。

Cookie的原理:
  1. 在客户端第一次访问服务器时,服务器会将Cookie对象中的键值对,以" Set-Cookie:key=value "的形式通过响应头发送给客户端
  2. 在客户端再次访问服务器时,客户端会在请求头中携带着" Cookie:key=value;… "发送给服务器
Cookie的细节:
  1. 多次发送Cookie对象给客户端,如果键相同,值不同,那么原来的值会被新的值覆盖

  2. 一次可以发送多个Cookie对象给客户端

  3. Cookie在客户端中可以保存多久呢?

    1. 默认情况,当浏览器关闭后,Cookie被销毁
    2. 可以持久化存储:setMaxAge(int seconds)
      1. 正数:实现了持久化存储
      2. 负数:默认值,浏览器关闭时,销毁Cookie
      3. 0:立即删除Cookie
  4. Cookie中不能直接存储中文,要存储中文到Cookie中,在存储前要对中文内容进行编码:

    String s = "中文";
    s = URLEncoder.encode(s,"utf-8");
    

    服务器获取到的请求时携带的Cookie是编码后的内容,在获取后需要对其进行解码:

    String value = cookie.getValue();
    value = URLDecoder.decode(value,"utf-8");
    
  5. Cookie的作用范围,也就是说客户端在访问服务器的哪些资源时,请求头中会携带着Cookie

    1. 默认情况,是当前web应用的任意资源
    2. 可以通过 setPath(String path):来设置cookie的携带路径(范围)
      1. setPath("/"):表示当前服务器中的任何web应用的任何资源在被访问时都会携带着Cookie
      2. setPath("/项目名/目录"):表示只有指定web应用下的指定文件夹下的任意资源在被访问时才会携带着Cookie
      3. setPath("/项目名"):表示只有指定web应用下的任意资源在被访问时才会携带着Cookie
      4. setPath("/项目名/文件名"):表示只有指定web应用下的指定资源在被访问时才会携带着Cookie
Cookie的特点:
  1. Cookie存储数据在客户端
  2. 客户端对于单个Cookie的大小有限制(4k),并且对同一域名下的Cookie数量也有限制(一般是20个)
  3. Cookie存储的数据不安全,用户可以随意的清空浏览器中保存的Cookie数据
Cookie的作用:
  1. 一般用于存储少量的用户信息

Session

概念

Session是服务端会话技术,能够在一次会话的多次请求间共享数据,将数据存储到服务端。

会话的概念

用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

Session的产生

当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。
这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去

方法:
  1. 创建/获取Session:request.getSession();
  2. Session是一个域对象:
    1. setAttribute(String key,Object value);
    2. getAttribute(String key);
    3. removeAttribute(String key);
Session的原理:
  1. Session的实现是依赖于Cookie
  2. 当调用 request.getSession()时,服务器会查找客户端的请求头中是否携带了存有指定JSESSIONID的Cookie,如果没有,则创建一个Session;如果有,则获取该Session对象
  3. 如果想要在关闭浏览器后(会话结束)还能访问到Session域中存储的数据,就需要对存有JSESSIONID的Cookie实现持久化
Session的细节:
  1. 客户端关闭,服务器不关,两次获得到的Session是否是同一个?
    1. 默认情况下,不是同一个
    2. 如果想要获得的是同一个Session,必须创建一个Cookie,键为 JSESSION,值是 session.getId(),并将此Cookie持久化
  Cookie c = new Cookie("JSESSIONID", session.getId());
  c.setMaxAge(60);
  response.addCookie(c);
  1. 服务器关闭,两次获得到的Session是否是同一个?
    无论存有JSESSIONID的Cookie是否持久化,在服务器关闭时,服务器中的Session都存储到tomcat\work\Catalina\localhost\虚拟路径下,生成一个SESSION.ser的文件来保存Session中的数据,这个过程叫Session的钝化。再次打开服务器时,服务器会中这个目录下读取之前保存的SESSIONS.ser文件到服务器中,并将此文件删除,这个过程叫Session的活化。

注:
1. 如果钝化的对象是自定义对象,需要将此类序列化
2. 多个被钝化的session会存储在同一个SESSIONS.ser文件中
3. 只有正常关闭服务器,Session才会被钝化

  1. Session对象何时被销毁?
    1. 在tomcat/conf下的web.xml中,默认配置session的失效时长是30分钟,也可以在当前项目web.xml中配置失效时长
    2. 可以通过 session.invalidate() 方法,立即释放session对象
<session-config>
   <session-timeout>1</session-timeout>
</session-config>
总结

用户通过浏览器访问网站,服务器会接收请求,查看用户是否有会话,如果没有,服务器会创建一个Session对象,Session是键值对形式,key-value,key是Tomcat随机创建,当然,我们也可以指定key。
同时,服务器也会创建Cookie,Cookie的value就是Session的key,即SessionID。
当请求响应时,cookie会被从服务端,带回给浏览器,存在浏览器中。
当用户再次访问该网站时,Cookie会被携带访问,这样服务端根据Cookie的value,就拿到了Session的key,也就拿到了Session的value,就知道该访问时哪个用户了,以及该用户之前保存的一些状态信息。
当我们向某个服务器发送请求时,凡是这个服务器发出的cookie,都会被携带过去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值