当前位置: 首页 > news >正文

破解HTTP无状态:基于Java的Session与Cookie协同工作指南

        HTTP协议自身是属于“无状态”协议

        无状态是指:默认情况下,HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接的关系

        但在实际开发中,我们很多时候是需要知道请求之间的关联关系的

        上述图中的令牌,通常就存储在Cookie字段中,此时在服务器这边就要记录“令牌”信息,以及令牌对应的用户信息,这就是Session机制所做的工作

一、理解Session和Cookie

        先来了解一下什么是会话

        会话是一个客户与服务器之间不中断的请求响应,对客户的每个请求,服务器能够识别出请求来自于同一个客户,当一个未知的客户向Web应用程序发送第一个请求时就开始了一个会话;当客户结束会话或服务器在一定时限内没有接收到客户的任何请求时,会话就结束了 

        在服务器并发处理海量请求时(如电商大促秒杀场景),​Session(会话对象)是服务端创建的特殊数据结构​,用于识别每个请求所属的用户身份和存储并维护会话与用户数据的映射关系(如购物车数据、登录状态)。

        Session的本质就是一个"哈希表",存储了一些键值对结构,Key就是SessionID,Value就是用户信息(用户信息可以根据需求灵活设计) 

        SessionId 在服务器这边是唯一的,前面提到的“令牌”就可以看作为 SessionId,只不过它还会携带一些其他的信息,比如时间,签名等

        (1)用户登录的时候,服务器会在Session中新增一个记录,通过HTTP响应中的Set-Cookie字段返回给客户端

        (2)客户端后续再次给该服务器发送请求时,会在HTTP请求中的Cookie字段中携带SessionId

        (3)服务器收到请求之后,根据SessionIdSession中查找并获取对应的用户信息,再进行后续操作,若找不到就会重新新增一个记录,返回SessionId(回到起初阶段) 

        Cookie ​​默认存储在用户的浏览器中,Session 由​​服务器管理​​(内存/数据库)

CookieSession区别

        Cookie是客户端保存用户信息的一种机制;Session是服务器保存用户信息的一种机制

        CookieSession之间主要是通过SessionId关联起来的

二、Cookie

2.1、定义

  • 客户端(浏览器)存储的小型文本数据(键值对形式),用于记录用户状态或标识

2.2、获取Cookie

@RestController
@RequestMapping("/Session")
public class GetSessionController {@RequestMapping("/A1")public String A1(HttpServletRequest request, HttpServletResponse response){Cookie[] cookies=request.getCookies();StringBuilder stringBuilder=new StringBuilder();if(cookies!=null){for(Cookie ck:cookies){stringBuilder.append(ck.getName()+"="+ck.getValue());}}return stringBuilder.toString();}
}

        HttpServletRequestHttpServletResponseServlet提供的两个类,是Spring MVC方法的内置对象

        HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中所有的信息都封转在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息

        HttpServletResponse对象代表服务器的响应,HTTP响应的信息都在这个对象中,通过该对象的方法,可以获得服务器响应的所有内容

         访问后得到了设置的Cookie

2.3、使用注解获取Cookie 

 @RequestMapping("/A2")public String A2(@CookieValue("name") String name){return  "name为:"+name;}

三、Session

3.1、定义​

  • 服务器创建的会话状态存储结构,本质是 ​​内存/数据库中的键值表​

3.2、存储Session

         Session是服务器端的机制,我们需要先存储,才能获取,Session是基于HttpServletRequest来存储和获取的

  @RequestMapping("/A3")public String A3(HttpServletRequest request){HttpSession session=request.getSession();if (session!=null){session.setAttribute("userName","Aokey");}return "Session设置成功";}

        运行后可以看到,HTTP响应后通过Set-Cookie告知客户端,把SessionID 存储在Cookies中

3.3、获取Session

        (1)HttpSession.getSession(boolean create);参数如果为true,那么当不存在会话时新建会话;如果为false,不存在会话时返回null

        (2)HttpSession.getSession();参数默认为true

  @RequestMapping("/A4")public String A4(HttpServletRequest request){HttpSession session=request.getSession(false);if(session==null){return "用户未登录";}else {String useName=(String) session.getAttribute("userName");Integer age=(Integer) session.getAttribute("age");return "姓名:"+ useName+" 年龄:"+age;}}

        先后访问:http://127.0.0.1:8080/Session/A3 和  http://127.0.0.1:8080/Session/A4

        Fiddler抓包后发现: 

 3.4、通过注解获取Session

 @RequestMapping("/A5")public String A5(@SessionAttribute("userName" ) String userName,@SessionAttribute("age") Integer age){return "姓名:"+ userName +" 年龄:"+age;}

        通过Spring MVC内置对象HttpSession来获取

 @RequestMapping("/A6")public String A6(HttpSession session){String userName=(String) session.getAttribute("userName");Integer age=(Integer) session.getAttribute("age");return "姓名:"+ userName +" 年龄:"+age;}

四、Header

4.1、获取Header

        获取Header也是通过HttpServletRequest对象获取

  @RequestMapping("/A7")public String A7(HttpServletRequest request){String string=request.getHeader("Cookie");return "获取到Cookie为:"+string;}

        运行结果:http://127.0.0.1:8080/Session/A7

         4.2、使用注解获取Header

 @RequestMapping("/A8")public String A8(@RequestHeader("Cookie")  String string){return "获取到Cookie为:"+string;}

相关文章:

  • 一个完整的时间序列异常检测系统,使用Flask作为后端框架,实现了AE(自编码器)、TimesNet和LSTM三种模型,并提供可视化展示
  • 八:操作系统设备管理之I/O 软件层次结构
  • 微软的新系统Windows12未来有哪些新特性
  • Redis-旁路缓存策略详解
  • Web3时代的数据保护挑战与应对策略
  • 如何流畅播放体育电竞赛事?
  • Java高效批量读取Redis数据:原理、方案与实战案例
  • Leetcode 3088. 使字符串反回文
  • AI智能体,为美业后端供应链注入“智慧因子”(4/6)
  • 六种高阶微分方程的特解(原创:daode3056)
  • win32com.client模块 —— Python实现COM自动化控制与数据交互
  • MySQL 事务的 ACID 四大特性及其实现原理
  • 国产三维CAD皇冠CAD在「金属压力容器制造」建模教程:蒸汽锅炉
  • 充电桩项目开发问题记录
  • 【Golang笔记04】Go语言中文件操作的学习笔记
  • 卓健易控ZJ-LIMS 实验室管理系统:为医院建设注入强大动力​
  • Vue + Element Plus 实战:大文件切片上传 + 断点续传
  • 网络各类型(BMA,NBMA,P2P)
  • 机器学习的数学基础:假设检验
  • 【Vue】初学Vue(setup函数,数据响应式, 脚手架 )
  • 网站安全检测百度/百度站内搜索提升关键词排名
  • 东营微信开发网站建设/免费制作网页的网站
  • 福州php做网站/如何在手机上开自己的网站
  • 众筹平台网站建设/杯子软文营销300字
  • 台州做网站/西安疫情最新情况
  • 网站建设一般多钱/阿里云服务器