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

无状态HTTP的“记忆”方案:Spring Boot中CookieSession全栈实战

  

在这里插入图片描述


🔍 开发者资源导航 🔍
🏷️ 博客主页: 个人主页
📚 专栏订阅: JavaEE全栈专栏

1. 什么是Cookie/Session?

http是无状态的,没有记忆力的,本次的通信和下次的通信是没有关联的,而在实际开发中是需要联系的。

那么能想到什么方法来解决它呢?存储!将信息存储起来建立关联。

但是网页是不被允许访问本地文件的,因此我们没办法将信息以文件的形式存储在本地。

我们只能将信息存储在服务器上面,而这些信息又被称之为“会话”,也就是Session。

我们的存储问题得到了解决,但是这样又会出现一个新的问题,如何将让客户端找到自己的Session呢?

Cookie就是两者关联的关键机制,Cookie是一种被允许存储在浏览器本身上的一种信息,当访问服务端时,Cookie会被一并带过去,这样服务端就能根据Cookie找到之前的会话状态。

一个典型的例子就是:

  • 当我们在一个网站上登录以后,之后的很长时间都不需要再次登录。

在浏览器中,我们点击F12可以直接查看到Cookie的存储信息:

2. 获取/设置Cookie

2.1传统方式

HttpServerletRequest和HttpServletResponse 是serverlet里面的东西,可以用来接受请求/响应,可以使用该类获取到请求/响应中的关键信息,在使用时,它的位置可以随意放 spring在看到它的时候会自动传给他。

设置Cookie:

    @GetMapping("/set-cookie")public String setCookie(HttpServletResponse response) {// 创建一个Cookie,名称为 "username",值为 "JohnDoe"Cookie cookie = new Cookie("username", "JohnDoe");// 设置Cookie的有效期(单位:秒),例如1小时cookie.setMaxAge(60 * 60);// 可选:设置Cookie的路径,通常设为 "/" 表示整个应用可用cookie.setPath("/");// 可选:设置是否仅通过HTTPS传输// cookie.setSecure(true);// 可选:设置是否仅通过HTTP访问,防止JavaScript访问(增强安全性)// cookie.setHttpOnly(true);// 将Cookie添加到响应中response.addCookie(cookie);return "cookie-set-success"; // 返回视图名称}

此时我们可以从浏览器中看到设置Cookie成功了。

注意:cookie的key值只能存在一个,如果设置的Cookie已经存在会覆盖掉旧的Cookie值。

获取Cookie:

    @RequestMapping("/cookies")public String cookies(HttpServletRequest request) {Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {System.out.println(cookie.getName() + ":" + cookie.getValue());}}return "yes";}

此时的结果会在编译器的终端上打印出来:

2.2 注解方式

@CookieValue可以获取到指定名称的Cookie值,但是缺点是只能获取到单一值,因此并不常用。

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

结果:

3. 获取/设置Session

3.1 传统方式

Cookie和Session的连接通过一个sessionId的Cookie值来进行传递的,服务器会使用哈希表来自动保存和设置他们两者之间的映射关系,方便之后的查询。

设置Session:

getSession()内部参数可以传入一个布尔值,默认为ture

如果为true,没有获取到session时,自动创建并返回一个空的Session对象。

如果为false,没有获取到session时,返回null。

    @RequestMapping("/setsession")public String setSession(HttpServletRequest request) {//根据cookie自动去获取sessionid,再根据sessionid去获取session对象,//因为默认是true,所以如果没有找到id会创建一个新的session//session是存储在内存里面的HttpSession session = request.getSession();//可以设置为参数,这样就是动态的了session.setAttribute("name","lyf");session.setAttribute("age",90);return "设置成功";}

此处我们运行成功后就多了一个Cookie值,它的作用就是用于连接服务器的会话状态,它的设置是自动的,并不需要我们手动进行。

我们也可以简化一下获取Session的方式,直接使用HttpSession作为传参类型,通过这样的方式获取相当于使用getSession方法传入了一个true的值,不存在时自动创建一个空的Session。

    @RequestMapping("/setsession")public String setSession(HttpSession session) {session.setAttribute("name","lyf");session.setAttribute("age",90);return "设置成功";}

获取Session值:

    @RequestMapping("/getsession")public String getSession(HttpServletRequest request) {//也是根据cookie去获取session,如果没找到这个session说明没有使用过setsession//也就没有session,可以认为没有登陆过HttpSession session = request.getSession(false);if (session == null) {return "no design infomation";}String name = (String)session.getAttribute("name");return "name:" + name;}

结果:

3.2 注解方式

通过@SessionAttribute注解直接获取当前会话的值,传入的参数是key值。

    @RequestMapping("/getsession1")public String getSession1(@SessionAttribute("name") String name) {return "name:" + name;}

http://www.dtcms.com/a/441776.html

相关文章:

  • Java 内存模型(JMM)面试清单(含超通俗生活案例与深度理解)
  • 2015网站建设专业建网站设计公司
  • vue+springboot项目部署到服务器
  • QT肝8天17--优化用户管理
  • QT肝8天19--Windows程序部署
  • 【开题答辩过程】以《基于 Spring Boot 的宠物应急救援系统设计与实现》为例,不会开题答辩的可以进来看看
  • 成都seo网站建设沈阳网站建设推广服务
  • 网站栏目名短链接在线生成官网免费
  • Task Schemas: 基于前沿认知的复杂推理任务架构
  • 第三十七章 ESP32S3 SPI_SDCARD 实验
  • 企业营销型网站特点企业信息查询系统官网山东省
  • docker-compose 安装MySQL8.0.39
  • Go语言入门(18)-指针(上)
  • Django ORM - 聚合查询
  • 【STM32项目开源】基于STM32的智能老人拐杖
  • YOLO入门教程(番外):卷积神经网络—汇聚层
  • 网站改版一般需要多久智慧团建学生登录入口
  • Dotnet接入AI通过Response创建一个简单控制台案例
  • 【论文笔记】2025年图像处理顶会论文
  • 用 Maven 配置 Flink 从初始化到可部署的完整实践
  • 做职业规划的网站seo学院
  • 怎么建优惠券网站太原seo排名外包
  • jmeter中java.net.ConnectException: Connection refused: connect
  • “十四五”科技冲锋:迈向科技强国的壮阔征程
  • 使用 Python 进行自然语言处理的完整初学者指南
  • 框架系统的多维赋能——论其对自然语言处理深层语义分析的影响与启示
  • HCIP 和 HCIE到底是报班还是自学好?
  • 网站建设要多少钱国外服装设计网站
  • Spring配置文件XML验证错误全面解决指南:从cvc-elt.1.a到找不到‘beans‘元素声明
  • 做美食视频网站有哪些网架公司招聘施工队伍