java session 和cookie的区别
一个简单的表格是这么创建的:
特性 | Cookie | Session |
---|---|---|
数据安全性 | 较低,数据存储在客户端,容易被篡改或窃取 | 较高,数据存储在服务器,客户端只保存一个 session ID |
生命周期 | 可以设置过期时间,即使关闭浏览器也能保留 | 默认情况下,浏览器关闭后 session 失效(可通过配置延长生命周期) |
浏览器关闭时是否会被销毁 | 不会(如果设置了过期时间) | 会(如果没有设置过期时间,即会话级 Cookie) 会(默认情况下,session 依赖于会话级 Cookie,浏览器关闭后 session ID 丢失) |
存储大小限制 | 单个 cookie 大小通常限制在 4KB 左右,每个域名下的 cookie 数量也有限制 | 理论上没有大小限制,但受服务器内存限制 |
适用场景 | 存储少量不敏感的数据,如用户偏好设置、记住登录状态等 | 存储敏感数据或大量数据,如用户登录信息、购物车数据等 |
实现方式 | 通过 HttpServletResponse 的 addCookie 方法设置 | 通过 HttpServletRequest 的 getSession 方法获取或创建 session |
代码示例 | java Cookie cookie = new Cookie(“key”, “value”); response.addCookie(cookie); | java HttpSession session = request.getSession(); session.setAttribute(“key”, “value”); |
读取方式 | java Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if (cookie.getName().equals(“key”)) { String value = cookie.getValue(); } } | java HttpSession session = request.getSession(); String value = (String) session.getAttribute(“key”); |
删除方式 | java Cookie cookie = new Cookie(“key”, “”); cookie.setMaxAge(0); response.addCookie(cookie); | java HttpSession session = request.getSession(); session.removeAttribute(“key”); // 或 session.invalidate(); |
补充说明:
Cookie 的销毁:
如果设置了 setMaxAge(过期时间),即使浏览器关闭,Cookie 也会保留,直到过期。
如果没有设置 setMaxAge,Cookie 是会话级的,浏览器关闭后会被销毁。
Session 的销毁:
默认情况下,Session 依赖于一个会话级的 Cookie(JSESSIONID)来维护会话状态。
浏览器关闭后,会话级 Cookie 会被销毁,导致服务器无法识别客户端的 Session ID,Session 也会失效。
可以通过配置(如设置 Session 的超时时间)来延长 Session 的生命周期。