前后端中的cookie和session

实际上,在大多数Web应用中,这个过程通常是自动处理的,不需要手动操作。以下是标准流程:

  1. 登录时 :当用户成功登录后,服务器会创建一个新的Session(如果之前还没有的话),并生成一个唯一的JSESSIONID。这个JSESSIONID会自动通过Set-Cookie HTTP响应头返回给客户端(浏览器)。这一过程由服务器端的Web容器(如Tomcat、Jetty或Servlet容器)自动完成,无需开发者手动介入。

  2. 浏览器存储Cookie :收到带有JSESSIONID的Set-Cookie响应头后,浏览器会自动保存这个Cookie(只要浏览器设置允许使用Cookie)。对于后续发送到同一域名下的所有请求,浏览器会自动在HTTP请求头中附加这个JSESSIONID

  3. 后续请求 :因此,在初次登录后,每当用户浏览应用程序的不同页面或发出Ajax请求时,浏览器会自动将JSESSIONID包含在Cookie中发送回服务器。这样,服务器就可以识别出这是同一个会话,维持用户的登录状态和会话数据。

简而言之,一旦登录流程由服务器正确处理,前端无需手动设置JSESSIONID到请求头中;浏览器和服务器之间关于Session ID的交换是自动完成的。只有在特定情况下,比如使用无Cookie方案或者需要手动控制会话(例如通过AJAX在非标准方式下管理会话)时,才需要特别处理JSESSIONID的传递。

在后续的HTTP请求中,服务器端会通过检查请求头中的Cookie字段来提取JSESSIONID,进而判断用户的会话状态。具体步骤如下:

  1. 接收请求 :当用户发起后续请求时,他们的浏览器会自动在请求头中附带之前保存的JSESSIONID(作为Cookie的一部分)。
  2. 会话匹配 :服务器接收到请求后,会检查这个JSESSIONID,并在服务器端的会话存储中查找对应的Session。如果找到了匹配的Session,这表明用户之前已经登录过,并且会话仍然有效。
  3. 状态判断 :基于Session是否存在及其内容(比如是否包含用户身份信息),服务器端可以决定用户是否已经登录。如果Session有效且包含必要的登录状态信息,就认为用户是已登录状态。注意,虽然通过JSESSIONID可以大致判断用户会话的有效性,但在实际应用中,为了安全起见,你还需要在Session中存储并验证更多细节,比如登录时间、用户角色权限等,以进一步确认用户身份和状态。因此,后端逻辑中确实涉及检查请求头中的JSESSIONID来辅助判断用户是否登录,但同时也要结合Session内部的数据进行综合验证。
  4. 代码:下面展示一些 代码片段
javascript 复制代码
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@Componentpublic class SessionValidationFilter 
implements Filter {    
@Override    
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            
throws IOException, ServletException {        HttpServletRequest httpRequest = (HttpServletRequest) request; 
       HttpServletResponse httpResponse = (HttpServletResponse) response;
                       // 获取Session,注意使用false参数表示如果没有Session则不创建新的       
                        HttpSession session = httpRequest.getSession(false);  
                                     // 检查Session是否有效,这里简单判断Session不为空且包含某个登录标记(如用户名)    
                                         boolean isLoggedIn = session != null && session.getAttribute("username") != null;        
                                         if (isLoggedIn) {            
                                         // 如果Session有效,继续处理请求            
chain.doFilter(request, response);        } else {          
  // 如果Session无效或不存在,重定向到登录页面  
            httpResponse.sendRedirect("/login");        }    }    
            // 其他Filter接口方法...}
相关推荐
Jenlybein6 分钟前
Vue3 权限控制:利用动态路由与自定义指令
前端·vue.js
XuanXu7 分钟前
Java AQS原理以及应用
java
风象南3 小时前
SpringBoot中6种自定义starter开发方法
java·spring boot·后端
mghio12 小时前
Dubbo 中的集群容错
java·微服务·dubbo
咖啡教室17 小时前
java日常开发笔记和开发问题记录
java
咖啡教室17 小时前
java练习项目记录笔记
java
鱼樱前端17 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea18 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea18 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq