【框架学习(6.2)-- SpringBoot登录验证之学习Session】

文章目录

Session

浏览器携带的是一整个cookie数组
服务器获取这个数组中有没有名为 JSESSIONID的cookie,然后验证服务器内部是否存有对应的session的id和这个cookie值一样。

1、如果请求内没有名为 JSESSIONID的cookie

2、存在名为 JSESSIONID的cookie,但它的value在服务器内找不到相同值的session id。

以上两种情况,都会创建一个新的session,并在response中加入一个:

nameJSESSIONIDvaluesession.getId()的cookie

下一次浏览器再发起请求的时候,如果cookie还没过期,将会带上携带的名为 JSESSIONID的cookie。
而服务器内还没有销毁这个会话的话,就视为是浏览器与服务器之间的一次没有结束的会话过程

写一个接口测试一下 Session类的使用:

    @RequestMapping(value = "/sessionLogin", method = RequestMethod.POST)
    public String sessionLogin(HttpServletRequest request, HttpServletResponse response) {//
        HttpSession session = request.getSession();
        System.out.println("创建时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(session.getCreationTime()));
        System.out.println("最后访问时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(session.getLastAccessedTime()));
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                System.out.println("request携带的Cookie 名称:" + cookie.getName() + "  value值:" + cookie.getValue() );
            }
        }else {
            System.out.println("request无Cookie,生成名为 " + "JSESSIONID" + "  且value值为:" + session.getId() );
        }
        System.out.println("会话Id为:" + session.getId() );
        System.out.println("Servlet 内容为:" + session.getServletContext().toString() );
        System.out.println("会话最大持续时间:" + session.getMaxInactiveInterval() );
        while (session.getAttributeNames().hasMoreElements()) {
            String attributeName = session.getAttributeNames().nextElement();
            System.out.println("会话属性名:" + attributeName + "  属性值:" + session.getAttribute(attributeName) );
        }
        System.out.println("未建立会话,或客户选择不加入会话:" + session.isNew() );
        if (!session.isNew()) {
            session.invalidate();
            System.out.println("非第一次访问:即将手动使此会话失效,再次请求接口将新建session! ");
        }
        return session.getId();
    }

PostMan 发送数据:

在这里插入图片描述
在这里插入图片描述

第一次请求打印:

创建时间:2022-11-30 16:14:59
最后访问时间:2022-11-30 16:14:59
request无Cookie,生成名为 JSESSIONID  且value值为:B26B4868702486405D11E7AC99D3FBD2
会话Id为:B26B4868702486405D11E7AC99D3FBD2
Servlet 内容为:org.apache.catalina.core.ApplicationContextFacade@39183f7d
会话最大持续时间:1800
未建立会话,或客户选择不加入会话:true

从输出里可以发现,浏览器最初是没有携带cookie的,服务器创建了session后,会创建对应的cookie返回给客户。
在这个过程中,接口逻辑中,可以对request中携带的用户名及密码进行校验,再创建cookie返回确认登录。

这时候,接收到一个cookie

在这里插入图片描述

第二次请求:

创建时间:2022-11-30 16:14:59
最后访问时间:2022-11-30 16:15:00
request携带的Cookie 名称:JSESSIONID  value值:B26B4868702486405D11E7AC99D3FBD2
会话Id为:B26B4868702486405D11E7AC99D3FBD2
Servlet 内容为:org.apache.catalina.core.ApplicationContextFacade@39183f7d
会话最大持续时间:1800
未建立会话,或客户选择不加入会话:false
非第一次访问:即将手动使此会话失效,再次请求接口将新建session!

可见,浏览器携带了cookie,服务器据此传给后端程序的session属性中isNewfalse,可以给予浏览器免密码登录,直接跳转到用户页面。

Session中可以存放用户的id、密码或者权限值等等。

默认创建的Session最大持续时间就是 1800s,也就是3分钟,不过可以手动设置,延长时间。
后台也可以手动执行invalidate() 方法使Session失效。

1、Session很明显的缺点就是,它只能存在于当前会话的服务器上,只有当前会话服务器能识别。
一旦服务器宕机,会话就没了,浏览器再次发起之前的会话请求就无效了。

2、由于负载均衡的轮询机制,接口请求到达另外的服务器上,是不会被认可的,需要重新登录。

3、虽然Session是存在于服务器端,但是同样认证过程中,是依赖于在客户与服务器之间传递的Cookie,所以对于Cookie拦截等情况,无办法。

4、况且现在单个节点的服务器一般都很难满足需求,所以单纯的使用session,实际开发中是不可取的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上岸撒尿的鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值