Cookie与Session:你的网络身份密码

发布时间:2026/7/16 8:42:42
Cookie与Session:你的网络身份密码 一、认识Cookie/SessionCookieCookie是什么Cookie是服务器发送到用户浏览器并保存在本地的一小块数据。它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。Cookie主要用于会话管理登录状态、购物车内容、游戏分数等个性化用户偏好、主题设置跟踪记录和分析用户行为Cookie通常由服务器通过HTTP响应头中的Set-Cookie字段设置浏览器收到后会将其存储在本地并在后续请求中通过Cookie请求头自动发送给服务器。Cookie的工作原理客户端首次访问服务器用户通过浏览器访问网站服务器在响应头中设置Cookie服务器生成Cookie并通过Set-Cookie响应头发送给浏览器浏览器保存这个Cookie浏览器将Cookie存储在本地内存或硬盘后续每次请求浏览器自动在请求头中携带Cookie浏览器向同一服务器发送请求时会自动在Cookie请求头中包含之前保存的Cookie服务器通过Cookie识别用户身份服务器解析Cookie内容识别用户身份和状态SessionSession是什么Session是服务器端的一种机制用于在多次HTTP请求间保持用户状态。由于HTTP协议本身是无状态的服务器需要一种方式来识别连续请求是否来自同一用户。Session机制通过在服务器端存储用户数据并为每个用户分配一个唯一的Session ID来解决这个问题。Session ID通常存储在Cookie中也可以存储在URL中浏览器每次请求时携带这个ID服务器根据ID找到对应的Session数据。Session的工作原理用户首次访问网站服务器创建Session并生成唯一的Session ID服务器将Session ID通过Cookie发送给浏览器通过Set-Cookie响应头将Session ID发送给客户端浏览器后续请求携带这个Session ID浏览器在Cookie中保存Session ID并在后续请求中自动携带服务器根据Session ID找到对应的Session数据服务器通过Session ID从Session存储内存、数据库等中查找对应的用户数据服务器可以读取、修改Session中的数据如用户信息、购物车内容、登录状态等Cookie 和 Session 的区别存储位置不同Cookie存储在客户端浏览器Session存储在服务器端安全性不同Session相对更安全因为敏感数据存储在服务器端Cookie存储在客户端可能被篡改或窃取存储容量不同Cookie有大小限制通常4KBSession理论上可以存储更多数据生命周期不同Cookie可以设置过期时间可以长期保存Session通常有超时时间关闭浏览器后可能失效关联方式Cookie和Session之间主要通过SessionId关联SessionId是Cookie和Session之间的桥梁使用关系Cookie和Session经常在一起配合使用但不是必须配合。可以用Cookie来保存一些数据在客户端这些数据不一定是用户身份信息也不一定是SessionId传递方式Session中的sessionId不一定非得通过Cookie/Set-Cookie传递也可以通过URL参数等方式传递举个栗子淘宝购物流程登录阶段输入用户名密码服务器验证成功后创建Session并存储你的用户ID服务器生成Session ID通过Cookie发送给浏览器浏览器保存这个Cookie浏览商品你点击商品详情页浏览器自动在请求头中携带Cookie包含Session ID服务器通过Session ID找到你的Session知道你是已登录用户服务器返回商品页面并记录你的浏览历史到Session中加入购物车你将商品A加入购物车服务器将商品A信息存储在你的Session的购物车数据中你继续浏览将商品B也加入购物车服务器更新Session中的购物车数据结算支付你去购物车页面服务器从你的Session中读取购物车所有商品你确认订单并支付支付完成后服务器清空Session中的购物车数据但可能保留订单信息到数据库 关键理解点Cookie就像你的会员卡号每次消费时出示商家通过卡号找到你的会员档案Session就像商家的会员档案系统存储你的消费记录、积分、购物车等信息没有Cookie服务器无法知道哪个Session属于你Cookie携带Session ID是连接客户端和服务器的桥梁没有SessionCookie只是一个无意义的IDCookie本身只存储标识信息真正的用户数据存储在服务器的Session中实际应用现代Web应用中Session数据通常存储在Redis等内存数据库中以提高性能和可扩展性这里的令牌就可理解为SessionId二、获取Cookie2.1 传统获取方式RequestMapping(/h11) public String method(HttpServletRequest request, HttpServletResponse response){ Cookie[] cookies request.getCookies(); StringBuilder buildernew StringBuilder(); if(cookies!null){ for(Cookie ck:cookies){ builder.append(ck.getName():ck.getValue()); } } return Cookie信息builder; }此时由于我们没有设置Cookie所以浏览器访问后得到Cooike值为null手动设置一下Cookie值以上我们可以得知Cookie也是可以伪造的也就是不安全的。所以使用Cookie时后端需要进行Cookie校验2.2 简洁获取方式RequestMapping(/h12) public String cookie(CookieValue(hhh) String hhh){ return h:hhh; }运行结果三、Session存储和获取Session是服务器端的机制我们需要先存储才能获取Session也是基于HttpServletRequest来存储和获取的3.1 存储SessionRequestMapping(h13) public String s(HttpServletRequest request){ //获取Session对象 HttpSession sessionrequest.getSession(); if(session!null){ session.setAttribute(username,java); } return session 存储成功; }3.2 获取Session获取Session有两种方式HttpSession getSessionboolean create//参数如果为true则当不存在会话时新建会话参数如果为false则当不存在会话时返回nullHttpSession getSession HttpSession getSession和HttpSession getSessiontrue含义一样默认值为truevoid setAttributeString nameObject value):使用指定的名称绑定一个对象到该session会话方法一RequestMapping(h14) public String s(HttpServletRequest request){ //如果session不存在不会自动创建 HttpSession session request.getSession(false); String usernamenull; if(session ! null session.getAttribute(username)! null){ username(String)session.getAttribute(username); } return usernameusername; }方法二RequestMapping(/h15) public String s(SessionAttribute(value username,required false) String username){ return usernameusername; }方法三RequestMapping(/h16) public String s(HttpSession session){ String username(String)session.getAttribute(username); return usernameusername; }四、获取Header方法一RequestMapping(/h17) public String header(HttpServletRequest request,HttpServletResponse response) { String userAgent request.getHeader(User-Agent); String name 测试用户; return name:userAgent; }方法二RequestMapping(/h18) public String header(RequestHeader(User-Agent) String userAgent){ return userAgent:userAgent; }两种方式运行结果均为五、响应5.1 返回静态页面Controller我们先创建一个前端页面此时按照之前方法访问结果发现页面并未正确返回http响应把 /index.html 当做了http响应正文的数据那Spring MVC如何才能识别出来 index.html 是⼀个静态页面呢需要把RestController改为Controller前面使用的RestController其实是返回数据的RestControllerControllerResponseBodyController定义一个控制器Spring框架启动加载时把这个对象交给Spring管理。ResponseBody定义返回的数据格式为非视图返回一个text/html信息5.2 返回数据ReponseBodyResponseBody 既是类注解, 又是方法注解如果作用在类上表示该类的所有方法返回的都是数据如果作用在方法上表示该方法返回的是数据。也就是说: 在类上添加ResponseBody就相当于在所有的方法上添加了ResponseBody 注解如果⼀个类的方法里 既有返回数据的, 又有返回页面的, 就把 ResponseBody注解添加到对应的方法上即可.5.3 返回HTML代码片段RequestMapping(/returnHtml) ResponseBody public String returnHtml() { return h1Hello,HTML~/h1; }使用Fiddler抓包工具可以看到响应中Content-Type常见取值有以下几种text/htmlbody数据格式为HTMLtext/cssbody数据格式是CSSapplication/javascriptbody数据格式是JavaScriptapplication/jsonbody数据格式是JSON5.4 返回JSONSpring MVC也可返回JSON六、小结咋天天这么困呢明明也睡了挺久的。难受难受真难受