01

您所在的位置:网站首页 cookie的生成规则 01

01

2023-06-15 03:56| 来源: 网络整理| 查看: 265

一、实现步骤 1、在服务器端生成一个唯一的会话ID,可以使用UUID或者随机数等方式生成,将它和用户的会话信息相关联。 // 生成会话ID并关联会话信息 String sessionId = UUID.randomUUID().toString(); Map sessionData = new HashMap(); sessionData.put("username", "binjie09"); sessionData.put("age", 25); sessionData.put("gender", "male"); // 将会话信息保存到全局变量中 Map sessions = new ConcurrentHashMap(); sessions.put(sessionId, sessionData); 2、在HTTP响应中添加Set-Cookie头信息,用来设置Cookie的属性,如下: // 设置Cookie属性 String cookieValue = sessionId; String cookieName = "SESSION_ID"; int maxAge = 60 * 60; // 过期时间为1小时 String path = "/"; boolean httpOnly = true; // 构造Cookie对象 Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setMaxAge(maxAge); cookie.setPath(path); cookie.setHttpOnly(httpOnly); // 将Cookie添加到HTTP响应中 response.addCookie(cookie); 3、浏览器收到响应后,将上述Cookie保存到客户端,以便在下次请求时发送给服务器。 4、服务器收到带有Cookie的请求后,可以通过读取Cookie中的session-id来获得相应的会话信息。 // 获取请求中的Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("SESSION_ID".equals(cookie.getName())) { // 根据会话ID获取会话信息 String sessionId = cookie.getValue(); Map sessionData = sessions.get(sessionId); // 进行业务处理 // ... } } } 5、在会话结束时,服务器可以将Cookie的过期时间设置为一个过去的时间,让浏览器删除它。 // 清除Cookie Cookie cookie = new Cookie("SESSION_ID", null); cookie.setMaxAge(0); cookie.setPath("/"); response.addCookie(cookie);

下面是一个Cookie保存用户会话状态的完整示例

import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/session") public class SessionServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 全局变量用来保存会话信息 private Map sessions = new ConcurrentHashMap(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取请求中的Cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if ("SESSION_ID".equals(cookie.getName())) { // 根据会话ID获取会话信息 String sessionId = cookie.getValue(); Map sessionData = sessions.get(sessionId); if (sessionData != null) { // 进行业务处理 String username = (String) sessionData.get("username"); int age = (Integer) sessionData.get("age"); String gender = (String) sessionData.get("gender"); System.out.println(username + ", " + age + ", " + gender); } } } } // 返回响应 response.getWriter().append("Server Time: ").append(String.valueOf(System.currentTimeMillis())); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 生成会话ID并关联会话信息 String sessionId = UUID.randomUUID().toString(); Map sessionData = new HashMap(); sessionData.put("username", "binjie09"); sessionData.put("age", 25); sessionData.put("gender", "male"); // 将会话信息保存到全局变量中 sessions.put(sessionId, sessionData); // 设置Cookie属性 String cookieValue = sessionId; String cookieName = "SESSION_ID"; int maxAge = 60 * 60; // 过期时间为1小时 String path = "/"; boolean httpOnly = true; // 构造Cookie对象 Cookie cookie = new Cookie(cookieName, cookieValue); cookie.setMaxAge(maxAge); cookie.setPath(path); cookie.setHttpOnly(httpOnly); // 将Cookie添加到HTTP响应中 response.addCookie(cookie); // 返回响应 response.getWriter().append("Session ID: ").append(sessionId); } }

实现了一个简单的Servlet,接收GET和POST请求。当收到GET请求时,服务器从Cookie中读取会话ID,并根据会话ID从全局变量中获取会话信息进行打印;当收到POST请求时,服务器生成一个新的会话ID并关联一些会话信息,同时将会话ID保存到Cookie中并返回给客户端。需要注意的是,此处的全局变量sessions是线程安全的。 

二、实现原理:

Cookie是一种储存在客户端(用户浏览器)中的小型文本文件,它用来保存在访问 Web 站点时产生的用户信息、会话状态等。实现原理如下:

服务器向客户端(浏览器)发送HTTP响应时,可以在响应头中设置Set-Cookie字段,将Cookie信息传递给客户端。

客户端接收到HTTP响应后,将Set-Cookie头中的信息保存到客户端计算机硬盘上的某个位置(如缓存或者本地文件)。

客户端在下次发送HTTP请求时,会将之前服务器设置的Cookie信息自动加入请求头中的Cookie字段中,随着请求一起发送给服务器。

服务器在接收到HTTP请求后,会解析请求头中的Cookie字段,取出其中的Cookie信息,判断是否匹配当前用户的会话信息,从而实现会话状态的维护。

需要注意的是,由于Cookie文件储存在客户端计算机上,因此可以被其他人看到和利用,所以在使用Cookie时需要注意安全性问题。例如,可以将Cookie信息加密或者使用https协议进行传输以提高安全性。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3