前后端中的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接口方法...}
相关推荐
笨蛋不要掉眼泪9 分钟前
Spring Boot + RedisTemplate 数据结构的基础操作
java·数据结构·spring boot·redis·wpf
打工的小王13 分钟前
java并发编程(六)CountDownLatch和回环屏障CyclicBarrier
java·开发语言
切糕师学AI16 分钟前
VSCode 下如何检查 Vue 项目中未使用的依赖?
vue.js·vscode
nbsaas-boot22 分钟前
如何进行 Vibe Coding:从“灵感驱动”到“可交付工程”的方法论
java·ai编程
Remember_99326 分钟前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
roman_日积跬步-终至千里30 分钟前
【Java并发】用 JMM 与 Happens-Before 解决多线程可见性与有序性问题
java·开发语言·spring
空空kkk30 分钟前
SSM项目练习——hami音乐(三)
java·数据库
我是伪码农35 分钟前
Vue 1.30
前端·javascript·vue.js
爬山算法39 分钟前
Hibernate(78)如何在GraphQL服务中使用Hibernate?
java·hibernate·graphql