前后端中的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. 代码:下面展示一些 代码片段
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接口方法...}
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸葛博仌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值