news 2026/6/23 23:13:01

会话技术Cookie与Session

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
会话技术Cookie与Session

作为前端对cookie和session 的原理并不多, 现在java入门后对前后端cookie和session会话有了进一步的了解

cookie

Cookie是存储在客户端的小型数据片段,由服务器通过HTTP响应头发送给客户端,客户端随后在每次请求中自动携带这些数据回服务器。Cookie主要用于会话管理、个性化设置和用户行为跟踪。

  • 存储在客户端,可随意篡改,不安全
  • 有大小限制(通常为4KB)
  • 有数量限制(一般一个浏览器对于一个网站只能存不超过20个Cookie)
  • 不可跨域,但一级域名和二级域名允许共享使用

下面是springboot设置的cookie, 当请求/set-cookie/basic 接口时, 后端就会在浏览器中设置一个key为username, 值为zhangsan , 会保存7天(当然可以通过清空换成,或手动修改的方法篡改), 后面和后端交互的时候,会把cookie携带

importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletResponse;@RestControllerpublicclassCookieController{@GetMapping("/set-cookie/basic")publicStringsetBasicCookie(HttpServletResponseresponse){// 创建 CookieCookiecookie=newCookie("username","zhangsan");// 设置属性cookie.setMaxAge(7*24*60*60);// 7天,单位:秒cookie.setPath("/");// 对所有路径有效cookie.setSecure(false);// 是否仅 HTTPScookie.setHttpOnly(true);// 禁止 JavaScript 访问// cookie.setDomain("example.com"); // 设置域名// 添加到响应response.addCookie(cookie);return"Cookie 设置成功";}}

下面是springboot读取cookie

importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.Cookie;@RestControllerpublicclassReadCookieController{// 方法1: 从 HttpServletRequest 读取@GetMapping("/profile")publicStringgetProfile(HttpServletRequestrequest){Cookie[]cookies=request.getCookies();Stringusername=null;if(cookies!=null){for(Cookiecookie:cookies){if("username".equals(cookie.getName())){username=cookie.getValue();break;}}}return"用户名: "+(username!=null?username:"未登录");}// 方法2: 使用 @CookieValue 注解@GetMapping("/welcome")publicStringwelcome(@CookieValue(value="username",defaultValue="游客")Stringusername,@CookieValue(value="theme",required=false)Stringtheme){returnString.format("欢迎 %s, 主题: %s",username,theme!=null?theme:"默认");}}

session

Session是存储在服务器端的用户会话信息,用于跟踪用户状态。当浏览器第一次访问服务器时,服务器会创建一个唯一的Session ID并通过Cookie发送给客户端,客户端后续请求携带此Session ID,服务器据此识别用户会话。
客户端发送登录请求

  • 服务器验证凭证并创建Session对象
  • 生成Session ID并通过Set-Cookie头返回客户端
  • 客户端后续请求自动携带Session ID
  • 服务器根据Session ID查找对应Session数据
  • 服务器返回响应内容
importjavax.servlet.http.HttpSession;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping("/session")publicclassSessionController{// 1. 存储 Session 数据@PostMapping("/login")publicStringlogin(@RequestParamStringusername,HttpSessionsession){// 存储用户信息session.setAttribute("username",username);session.setAttribute("loginTime",newDate());session.setAttribute("userId",12345);return"登录成功,Session ID: "+session.getId();}// 2. 读取 Session 数据@GetMapping("/profile")publicMap<String,Object>getProfile(HttpSessionsession){Map<String,Object>profile=newHashMap<>();profile.put("sessionId",session.getId());profile.put("username",session.getAttribute("username"));profile.put("loginTime",session.getAttribute("loginTime"));profile.put("isNew",session.isNew());profile.put("creationTime",newDate(session.getCreationTime()));profile.put("lastAccessed",newDate(session.getLastAccessedTime()));returnprofile;}// 3. 删除 Session 数据@GetMapping("/logout")publicStringlogout(HttpSessionsession){// 移除单个属性session.removeAttribute("username");// 或清空所有属性Enumeration<String>attrNames=session.getAttributeNames();while(attrNames.hasMoreElements()){session.removeAttribute(attrNames.nextElement());}// 使 Session 无效(登出)session.invalidate();return"已退出登录";}// 4. 更新 Session@PostMapping("/update-theme")publicStringupdateTheme(@RequestParamStringtheme,HttpSessionsession){session.setAttribute("theme",theme);return"主题已更新为: "+theme;}}

cookie和session

示例

利用hutool设置的简单的验证码类

当生成验证码图片后,同时也获得了图片里的4位code
问题是用户输入的4位字符串如何和生成的code去匹配呢?

一种方法就是利用session , session是利用cookie来实现的,生成一个JSESSIONID, 告诉后端,我访问的是对应的session.
springboot就可以利用session.getAttribute(SESSION_KEY) 来读取服务器端存的对应的code, 两相对比, 就能校验用户输入的和生成的验证码是否一致了

packagecom.example.demo.autil;importcn.hutool.captcha.CaptchaUtil;importcn.hutool.captcha.ShearCaptcha;importcn.hutool.captcha.generator.RandomGenerator;importcn.hutool.core.util.StrUtil;importlombok.extern.slf4j.Slf4j;importjavax.imageio.ImageIO;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.io.OutputStream;@Slf4jpublicclassSimpleCaptchaUtil{privatestaticfinalintWIDTH=130;privatestaticfinalintHEIGHT=48;privatestaticfinalintCODE_COUNT=4;privatestaticfinalintLINE_COUNT=4;privatestaticfinalStringCODE_CHARS="23456789abcdefghjkmnpqrstuvwxyz";privatestaticfinalStringSESSION_KEY="captcha_code";/** * 生成验证码并输出到响应流 */publicstaticvoidcreateAndWrite(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{// 1. 创建验证码ShearCaptchacaptcha=CaptchaUtil.createShearCaptcha(WIDTH,HEIGHT,CODE_COUNT,LINE_COUNT);captcha.setGenerator(newRandomGenerator(CODE_CHARS,CODE_COUNT));// 2. 获取验证码和图片Stringcode=captcha.getCode();BufferedImageimage=captcha.getImage();// 3. 保存到SessionHttpSessionsession=request.getSession();session.setAttribute(SESSION_KEY,code);session.setMaxInactiveInterval(300);// 5分钟// 4. 输出图片response.setContentType("image/png");response.setHeader("Pragma","no-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires",0);// cookie的设置// 创建 CookieCookiecookie=newCookie("simpleCaptcha",code);// 设置属性cookie.setMaxAge(7*24*60*60);// 7天,单位:秒cookie.setPath("/");// 对所有路径有效cookie.setSecure(false);// 是否仅 HTTPScookie.setHttpOnly(true);// 禁止 JavaScript 访问// 添加到响应response.addCookie(cookie);try(OutputStreamout=response.getOutputStream()){ImageIO.write(image,"png",out);}}/** * 验证验证码 */publicstaticbooleanvalidate(StringinputCode,HttpServletRequestrequest){log.info("inputCode:{}",inputCode);HttpSessionsession=request.getSession(false);if(session==null){returnfalse;}StringsessionCode=(String)session.getAttribute(SESSION_KEY);log.info("sessionCode",sessionCode);if(StrUtil.isBlank(inputCode)||StrUtil.isBlank(sessionCode)){returnfalse;}booleanisFresh=sessionCode.equalsIgnoreCase(inputCode.trim());// 一次性验证// if (isFresh) {// session.removeAttribute(SESSION_KEY);// }returnisFresh;}}

一句话: cookie存在用户的浏览器里, session存在服务器端. 一个会话(用户访问),用户和服务器就有个临时存储数据的地方, 可以临时取用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/22 23:51:27

保姆级AI辅助科研选题指南!利用Gemini 3 Pro选出可操作、新颖且有价值的高质选题(附AI提示词模板)

学术写作的首要步骤就是选题,这一步不仅能确定后续研究的方向和目标,还会直接影响到理论框架的搭建和研究方法的选择。这一过程要求科研同仁具备扎实的专业知识和敏锐的洞察力,才能在自己的学科领域精准捕捉到前沿热点,或是发现研究空白。 选题最关键的是要考虑研究的可行…

作者头像 李华
网站建设 2026/6/23 2:22:00

Java后端的几种实现方式,从中白到精通,收藏这篇就够了

java后端的几种实现方式 最近没事在做一些小题目&#xff0c;遇到需要提供http restful接口&#xff0c;通过接口操作zookeeper实现增删改查。虽然之前看过java后端的内容&#xff0c;但是基本忘的差不多了&#xff0c;这次梳理了一下&#xff0c;都是入门的东西。自己总结用&…

作者头像 李华
网站建设 2026/6/21 2:07:36

高数强化NO20|曲线弧长|旋转曲面面积|功

曲线弧长 曲线方程用参数方程表示 ds(dx)2(dy)2s∫ab(dx)2(dy)2∫ab(x′(t)dt)2(y′(t)dt)2∫ab(x′(t))2(y′(t))2 ∣dt∣∫ab(x′(t))2(y′(t))2dt \begin{aligned} &ds \sqrt{(dx)^2 (dy)^2} \\ \\ &s \int_{a}^{b} \sqrt{(dx)^2 (dy)^2} \int_{a}^{b} \sqrt{\…

作者头像 李华
网站建设 2026/6/22 5:07:03

学习笔记——文件I/O

文件I/O和目录操作一、系统调用与C库函数1. 系统调用 (File I/O)操作系统提供的底层接口直接访问内核功能功能强大&#xff0c;但平台相关对设备文件操作更高效2. C库函数 (Standard I/O)C标准库提供的高级接口跨平台&#xff0c;通用性好带缓冲机制&#xff0c;适合非设备文件…

作者头像 李华
网站建设 2026/6/23 10:58:05

应用——文件I/O操作代码

文件I/O操作代码分析 一、基础文件操作 1. 打开文件 - 01open.c #include <fcntl.h> #include <stdio.h>int main(int argc, char **argv) {int fd open("1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);if (-1 fd) {fprintf(stderr, "open err…

作者头像 李华
网站建设 2026/6/22 17:05:30

SpringBoot3+Vue3新闻动态网站

基于 Spring Boot 3.1.5 MyBatis-Plus 3.5.8 Vue3 MySQL Element-Plus 开发的校园新闻动态网站系统。技术栈后端Spring Boot 3.1.5MyBatis-Plus 3.5.8MySQLJWT 认证Hutool 工具类前端Vue 3Vue Router 4PiniaElement PlusEChartsWangEditor 富文本编辑器Axios功能模块用户角…

作者头像 李华