超详细Cookie&&Session的原理与用法

超详细Cookie总结

超详细Cookie总结

session简介

当访问服务器首次网页的时候,会在服务器端的内存里开辟一块空间,为每个用户浏览器创建一个会话对象session,tomcat生成的jsessionid来表示这个session。这块内存是跟浏览器关联在一起的,默认一个浏览器独占一个session对象(下面有详解),是用来维护一个客户端(浏览器)和服务器的间会话的技术。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,最常用的是用session保存用户信息用于登录后的显示

session用法

前言:HTTP协议是非连接性的,取完当前浏览器的内容,然后关闭浏览器后,链接就断开了,而没有任何机制去记录取出后的信息。这样,一个网站的各个请求页面都是相互独立的,宛如一座座孤岛。但实际上,页面和页面之间需要紧密联系才能完成一套完整的功能。而session在这里就扮演着桥梁的作用,举个电商业务的案例

  • 购物车的实现:在商城商品页面添加商品到购物车(商品即对应product对象,cart里面维护一个product列表表示购物车对象)。在将购物车对象cart存到session。而到了购物车页面,就遍历session的cart对象获取购物车每个商品的详细属性,这样就通过session将商品页与购物车页面关联了起来。
  • 从购物车页面点击结算生成订单页面,也是从session中取出cart对象的信息生成相关的订单对象order

总之,实际开发中有很多需要多接口共享的数据,比如上述的cart对象,因为http协议是无连接的,通常是通过session来解决的,因为session本质是服务器层级的缓存,需要服务器层级(多接口)共享数据的话直接把这个数据存入sesion即可,但注意session本质是服务器层级的缓存,但在分布式集群环境下,一个集群拥有大量服务器,每个服务器对应不同的tomcat服务器,那么session肯定是无法实现集群间数据共享的,但实现集群间数据共享的又离不开session,解决方案参考下文。

分布式session解决方案

4种分布式session解决方案

Session的基本操作

1、创建/获取session
第一次调用request.getSession()是创建session会话,当服务器创建完session对象后,会把session对象的id以cookie形式返回给客户端。这样,当用户保持使用当前浏览器的情况下再去访问服务器时,会把session的id传给服务器,服务器根据session的JSESSIONID来为用户提供相应的服务。也就是说除了第一次调用后续的调用都是直接使用之前已创建好的session会话,我们可以通过isNew()方法来判断是否为刚创建的session

JSESSIONID就是session的唯一标识id,存储在cookie中,这个cookie最终也会存储在浏览器端,而cookie的一个重要特点就是浏览器每次发起请求时都会带上cookie(在请求头中带有Cookie信息),这样服务器就能通过接受JSESSIONID来与浏览器建立会话
在这里插入图片描述

这里,当服务端调用request.getSession()时,如果session是新建的,可能内部做了如下处理:

//获取session的Id
String sessionId = session.getId();
//将session的Id存储到名字为JSESSIONID的cookie中
Cookie cookie = new Cookie("JSESSIONID", sessionId);
//设置cookie的有效路径
cookie.setPath(request.getContextPath());
//通过response将cookie的内容通知并存储在浏览器上
response.addCookie(cookie);

2 session值的存取

    @RequestMapping("/test.html")
    @ResponseBody
    public String createSession(HttpServletRequest req){
        HttpSession session = req.getSession();
        session.setAttribute("key1","value1");
        System.out.println("获取的session的值:" + session.getAttribute("key1"));//value1
        return "test";
    }

3 session默认声明周期是30分钟,这是在tomcat中设置的

既然tomcat的大web.xml可以设置,那么我们项目的小web.xml也能设置,而且优先级肯定高于tomcat的大web.xml

  <session-config>
<!--    配置整个项目的session默认超时时长是20min-->
    <session-timeout>20</session-timeout>
  </session-config>

实际开发中需要更加准确的指定session超时时长
注意点:超时是指最后一次请求的时间到现在的时长超过了session指定的超时时长。例如,session的超时时长是3秒,在此期间一直刷新请求session的存在时间也会一直被刷新为0,这样session就不会过时,只有等待请求发送三秒后session才会真正超时

@RequestMapping("/test2.html")
    public String SessionTime(HttpServletRequest req){
        HttpSession session = req.getSession();
        //获取Session的默认时长
        int maxInactiveInterval = session.getMaxInactiveInterval();
        System.out.println("session的默认时长:" + maxInactiveInterval);
        //session默认超时时长设为3秒
        session.setMaxInactiveInterval(3);
        return "index";
    }
在这里插入代码片

浏览器和Session的技术内内幕

1 第一次调用session就是新建一个session会话,比如我们这里把对象a存入了session;服务器内存开辟一个特定的存储session对象的空间来存储对象a,同时服务器端生成一个唯一的sessionId并通过response将其回传给了浏览器,浏览器端立马生成相应的cookie存储这个JSESSIONID
2 在保持使用当前浏览器且session没有超时的情况下,无论多少次请求都是服务器直接从存储空间中直接拿出a用,为何能精准的拿出相应的对象a?这是通过唯一的标识JSESSIONID来做到的
3 在保持使用当前浏览器且session没有超时的情况下,我们删除了浏览器端存储JSESSIONID的cookie,再次向服务器发起请求,发现拿到的是一个全新的session,为何?因为此时服务器接收不到JSEESIONID是无法从存储空间找到之前那个session的,无奈之下只能再给你创建一个新得JSEESIONID。

结合下图加深理解
在这里插入图片描述

Cookie与Session区别

彻底了解Cookie和Session的区别(面试)

扩展

1 session明明还没超时,为何浏览器一关闭session就失效?
因为session底层工作是依赖于cookie的,而cookie的生命周期默认是浏览器关闭时死亡,也就浏览器无法再次获取JSESSIONID.,这种情况类似于删除了当前正在使用浏览器的JSEESIONID,请参考上述步骤3

2 如何实现session长久生效,即使关闭浏览器也不受影响?

HttpSession session = req.getSession();
session.setAttribute("xxx",xxx);
//给session设置一个很长的超时时间
session.setMaxInactiveInterval(300000000);
//自定义存sessionId的cookie,防止浏览器关闭后服务器建立的存储sessionId的cookie消失
Cookie cookieSId = new Cookie("JSESSIONID",session.getId());
//给cookie设置一个很长的超时时间
cookieSId.setMaxAge(60 *60 * 10000);
//设置cookie的有效路径,默认为当前路径,我的当前路径是/book
cookieSId.setPath("/book");
//将cookie保存到resp域中让使浏览器创建保存JSESSIONID的cookie
resp.addCookie(cookieSId);
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值