前后端中的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接口方法...}
相关推荐
4Forsee10 分钟前
【Android】浅析 Android 的 IPC 跨进程通信机制
android·java
来旺24 分钟前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试
Json____24 分钟前
使用node Express 框架框架开发一个前后端分离的二手交易平台项目。
java·前端·express
since �24 分钟前
前端转Java,从0到1学习教程
java·前端·学习
詩句☾⋆᭄南笙25 分钟前
Mybatis一对一、一对多
java·mybatis·resulttype·resultmap·一对多·一对一
Andya_net37 分钟前
Java | 基于redis实现分布式批量设置各个数据中心的服务器配置方案设计和代码实践
java·服务器·分布式
lang2015092838 分钟前
Spring Boot 外部化配置最佳实践指南
java·spring boot
沐浴露z1 小时前
【JVM】详解 垃圾回收
java·jvm·算法
重生之我要当java大帝1 小时前
java微服务-尚医通-管理平台前端搭建-医院设置管理-4
java·开发语言·前端
我是日安1 小时前
从零到一打造 Vue3 响应式系统 Day 27 - toRef、toRefs、ProxyRef、unref
前端·javascript·vue.js