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

简单学习 --> Cookie 和Session

Cookie

Cookie是 http请求 header 中的一个属性; (是浏览器 持久化存储数据的一种 机制) ;

网页无法 访问 服务器的文件系统, 要存储数据就得使用其他方式 ;(Cookie 中保存的数据,也是 键值对格式(用户自定义的),最终也是要把这个键值对和请求一起发送回服务器的, 服务

Cookie 会存储:当前用户的身份信息

虽然 Cookie里的 的键值对 是用户自定义的,但有一个特殊情况,就是 Cookie会存储当当前用户的身份信息 (

例子:

Cookie 类似于: 就诊卡, 卡里有你的 身份信息; 可以通过这个卡 ,在医院的系统上查询到 你的各种信息(年龄,地址,余额,生的什么病,病史....) , 这些信息是不存在卡里,而是在系统了,不会说,卡丢了,信息就丢了 ; 卡只是存一个身份标识

上面说的一系列数据,每个人都会有数据,都是存在服务器里的,

这些数据都是在 数据库里的, 但 服务器执行操作的过程中, 数据就会从 数据库 查询出来,

先临时存在

这个内存结构就是

Session(会话)

Cookie 和 Session 这两个相互配合使用:

那么通过 SessionId就可以查询到,自己的 Session

服务器通过 hash表这样的 键值对结构来存储 Session (SessionId就是 key , Session 就是value, Session里又能存放各种用户信息(程序员自定义) )

发送请求(带有Cookie)时, 系统按 Cookie查询,就知道了当前用户的信息 ;

使用 Cookie 和 Session

常用Cookie/Session的机制来完成 登录功能的实现 ;

Cookie 是浏览器的机制, Servlet 提供了api 来获取 Cookie ;

Session 是服务器 的机制, Servlet 内部也实现好了,提供了api 来使用 ;

关键类 : HttpServletRequest

方法

1. Cookie[] getCookies() 获取请求中所有的 Cookie 内容 ; 一个Cookie对象就是一个键值对(name ,value) ​ 2. HttpSession getSession() 能从Cookie中获取SessionId ,并且查询出Session ; 如果 SessionId 没有在hash表里 ,也能创建出 对象键值对(分配新的SessionId , 创建出新的HttpSession对象) ​ Servlet 就是通过 HttpSession类 来表示一个会话, 服务器上用来存储Session的hash表就类似于这样 HashMap<String, HttpSession> 这样的来存储Session ; id Session对象
HttpServletResponse
1. addCookie() 把Cookie 加到响应里 ;
HttpSession
1. getAttribute() Attribute:属性 2. setAttribute() ​ Session对象里也是键值对结构的, 这些键值对属性,通过这两个方法来完成
Cookie
1. getName() 2. getValue() 获取 Cookie的名字 和 值

实现登录页面

  1. 发起Http请求,触发登录(带上用户名,密码)

  2. 通过Servlet读取用户名和密码 ;验证是否登录成功 ;(登录成功,创建一个会话Session,并且把得到的SessionId,通过Cookie返回给客户端,客户端就会保存这个Cookie)

  3. 登录成功,跳转到页面主页(跳转到另一个Servlet页面,把刚才的用户数据显示到页面上) ;

登录页面
请求

处理请求

步骤

1.读取请求参数,(username 和 password) 2. 验证用户名和密码,看是否正确,一般通过数据库 3. 登录成功 ,创建会话 ;(会话创建好,可以保存一些信息) 4. 登录成功, 跳转到网站首页(使用重定向, 本身就发送一个get请求) 创建index主页 5. 获取Session,拿到用户信息 6. 拿到会话信息, 7. 拿到的数据,生成一个页面 (将数据写到响应里)
细节问题:
处理请求 1. 在读取请求中的参数前设置字符集,防止getParameter乱码username 2. 判断username和password时, 让设置的 "密码".equals(username) , 防止 username为null equals针对参数为null进行了处理 3. 登录成功,使用重定向,跳转到主页 主页操作 4. 要判断SessionId是否存在(在拿到Session对象后,判断Session是否为null)

查询/创建Session

创建好Session后,自动保存到hash表里, 把SessionId 设置到响应了(在header里加上Set-Cookie字段), 浏览器收到响应后把SessionId保存到Cookie里 ;

getSession()创建出新的会话(生成SessionId,和Session,并且保存到hash表里), 把SessionId设置到 响应的 header中的set-Cookie字段中 ; 浏览器收到响应,就会把这个set-Cookie保存到浏览器的 Cookie中; 浏览器保存SessionId到Cookie后; 这样后续访问服务器时,能够带上这个Cookie; ​ 后面重定向到 index主页, 所发送的 get请求 , 就会带有Cookie,Cookie里就会有SessionId,这样有这个身份标识 后续 服务器的Servlet就会通过这个SessionId查询hash表,拿到刚才创建的Session对象 ; 这样同一个Session对象就可以拿到同一个属性数据 ;

数据共享

在getSession内部是拿着 SessionId去查询的,SessionId自然在同一个浏览器的访问/Cookie ,就能拿到同一个对象

前面设置了属性,后面也可以通过相同的key来拿到value,即使是在不同的servlet

Attribute

import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; ​ @WebServlet("/login") public class Login extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.读取请求参数,(username 和 password) //读取前设置一下字符集,防止getParameter乱码 req.setCharacterEncoding("utf8"); String username = req.getParameter("username") ; String password = req.getParameter("password") ; // 2. 验证用户名和密码,看是否正确,一般通过数据库 // 这里直接把用户名和密码 设置好 // zhangsan在前面防止 用户和密码 为null或其他错误 if(!"zhangsan".equals(username)|| !"123".equals(password)){ //如果用户名和密码对不上 //登录失败, 给用户返回失败提示 ; resp.setContentType("text/html; charset=utf8"); resp.getWriter().write("当前用户名或密码错误"); return; } // 3. 登录成功 ,创建会话 ; HttpSession session = req.getSession(true); // 给会话保存一些,自定义的数据, Attribute也是键值对,存储什么数据都可以 session.setAttribute("username" , username); session.setAttribute("loginTime" ,System.currentTimeMillis()); // 4. 登录成功, 跳转到网站首页 resp.sendRedirect("index"); ​ } } ​
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; ​ //通过这个servlet生成页面 @WebServlet("/index") public class IndexServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取到当前用户的 会话对象 , 生成的页面要当前用户的信息 HttpSession session = req.getSession(false) ; // 不需要创建Session对象,直接返回Session // 如果SessionId 不存在,没有在hash表中,则表示该用户不存在 if(session == null) { resp.setContentType("text/html; charset=utf8"); resp.getWriter().write("你当前尚未登录!"); return ; } // 2. 从 会话中拿到用户信息 String username = (String) session.getAttribute("username"); Long longinTime = (Long) session.getAttribute("loginTime"); //3. 把上面的数据生成页面 resp.setContentType("text/html; charset=utf8"); String respBody = "hello "+username +" 上次登录的时间为:"+longinTime ; resp.getWriter().write(respBody); } } ​
登录状态

当登录成功, 后面在登录同一个网站,就不需要重新登录,会自动有登录信息 ;

当前登录的SessionId也有有效期,可以在Cookie里设置,让浏览器到时就删除掉,也可以让服务器到时就删除掉Session ;

http://www.jsqmd.com/news/811520/

相关文章:

  • 重复率和AI率都超标怎么一次降?嘎嘎降AI双引擎几分钟双降不打架! - 我要发一区
  • 领星、聚水潭与金蝶云星空三方系统对接技术方案
  • MediaCreationTool.bat:Windows部署自动化脚本封装架构深度解析
  • Midjourney提示词工程终极护城河:基于CLIP文本嵌入空间的向量对齐技术(附Python可视化调试工具)
  • 各方筹码三分天下通达信指标筹码三分法含1主图2副图1选股工具
  • 【Amazon Quick 桌面 AI 助手初体验】把重复造轮子的活交给 Quick 大显身手
  • SSD201-富利威
  • 5分钟永久激活Windows和Office:KMS智能激活终极指南
  • 初创公司如何利用Taotoken多模型能力快速验证AI产品创意
  • whisper.cpp 深度解析:从边缘设备到实时语音识别
  • 3D Tiles Tools终极教程:从零开始掌握地理空间3D数据处理
  • 【卷卷观察】AI商业化:免费午餐结束
  • 兴化别墅品牌亲测对比,哪家更值得入手? - 花开富贵112
  • OBS高级计时器插件:如何高效管理直播时间的完整指南
  • Python 爬虫进阶技巧:Session 会话保持登录态持久化采集
  • Windows上运行iOS应用:ipasim模拟器完整指南与实战教程
  • 2026年发稿平台TOP测评:谁在重新定义品牌传播效率? - 博客湾
  • 赛博朋克2077画面材质美化包2026最新版下载分享
  • 2026年AI大模型API中转服务实测:揭秘哪家平台是生产环境的最佳解决方案?
  • 全栈开发新范式:Vibe-Stack集成技术栈实战解析
  • 第二天答辩今晚AI率才查出来?嘎嘎降AI几分钟从重灾区降到合格区间! - 我要发一区
  • 安装Claude Code 报错 Unable to connect to Anthropic services
  • 不仅是一份家教:天津大学家教网,一个由两万名在校学霸组成的大学生自主运营团队 - 教育资讯板
  • 简单学习 --> WebSocket
  • 处理后文风变成小学生作文?嘎嘎降AI学术语感训练保留论证逻辑! - 我要发一区
  • Evotown——开启本地化、可验证的AI智能体进化新时代
  • iPad协议开发老哥的避坑指南
  • BilibiliVideoDownload跨平台视频下载工具:从安装到高级配置的完整指南
  • Angular 17与Firebase全栈实战:从零构建现代化Web应用
  • 2026年必看!AI大模型API加速站深度剖析,诗云API(ShiyunApi)等平台推荐