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

会话技术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存在服务器端. 一个会话(用户访问),用户和服务器就有个临时存储数据的地方, 可以临时取用

http://www.cnnetsun.cn/news/2513.html

相关文章:

  • 保姆级AI辅助科研选题指南!利用Gemini 3 Pro选出可操作、新颖且有价值的高质选题(附AI提示词模板)
  • Java后端的几种实现方式,从中白到精通,收藏这篇就够了
  • 高数强化NO20|曲线弧长|旋转曲面面积|功
  • 学习笔记——文件I/O
  • 应用——文件I/O操作代码
  • SpringBoot3+Vue3新闻动态网站
  • 销售年终汇报再也不难写:AI自动把你的业绩转成完整PPT
  • 高性能ESAM芯片LKT4305GM
  • 销售年终总结PPT这样做最快:AI一键生成,从业绩到亮点全自动呈现
  • 销售工作太杂做不出PPT?AI自动帮你生成逻辑清晰的年终总结
  • 指针,不多的记录
  • Pandas库和画图
  • 第三方库Numpy
  • 中年危局:当职场抛弃你,比你想象的更早——一场静悄悄的社会性“死亡“
  • 项目解决方案:某湖泊AI微光增强水域监控解决方案
  • 协作传感加密密钥更新最佳实践(20年安全专家亲授)
  • 资源利用率提升80%?:深度解析量子-经典混合分配新范式
  • 量子编程调试技术深度解析(90%开发者忽略的关键细节)
  • 从下单到签收缩短40%时间:揭秘头部企业物流网络调度模型
  • 2030年网络安全倒计时:边缘量子密钥存储部署为何必须现在启动?
  • 为什么90%的量子编程课程失败?:教育设计中的4大盲区必须避开
  • 结构电池性能预测误差深度解析(误差来源全曝光)
  • 为什么你的AI服务在云端总崩溃?揭开故障转移配置的3个致命盲区
  • 【金融交易量子加速的安全验证】:揭秘量子计算时代下金融系统安全的十大挑战与应对策略
  • 【智慧城市安全防线】:如何在3步内实现RBAC与ABAC融合管控
  • 错过等于落后十年:量子增强医疗影像的7大应用场景全面解析
  • 跨技术领域标准规范落地实践(从混乱到统一的架构进化)
  • 独家解密:全球仅3国掌握的6G AI协议兼容性核心技术
  • 量子-经典混合资源分配实战指南(20年专家亲授架构设计秘诀)
  • 量子程序调试难题如何破解?3步实现精准错误定位与修复