前后端中的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接口方法...}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF训练1

1985E 看完题目之后 , 第一想法是最暴力的On3 , 对于每个i ,j ,k , 如果它们符合k的体积的话,我们就可以把这个长方体一格一格的移动 , 对于x方向 , 我们一共能移动a - i次 &#x…

1.x86游戏实战-认识CE

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提取码:6tw3 复…

Day5:有效的字母异位词 242 两个数组的交集 349 快乐数 202 两数之和1

题目242. 有效的字母异位词 - 力扣(LeetCode) class Solution { public:bool isAnagram(string s, string t) {//把数组当成哈希表,用两个数组来存储取模后的字母对应的数量//26个字母, 模25 0~25int arrs[26];int arrt[26];for(…

Python数据分析第一课:Anaconda的安装使用

Python数据分析第一课:Anaconda的安装使用 1.Anaconda是什么? Anaconda是一个便捷的获取包,并且对包和环境进行管理的虚拟环境工具,Anaconda包括了conda、Python在内的超过180多个包和依赖项 简单来说,Anaconda是包管理器和环境…

前端实战:实现块级元素的拖拽与缩放功能

在现代网页开发中,用户交互是一个非常重要的部分。在这篇文章中,我们将详细介绍如何使用原生 JavaScript 实现块级元素的拖拽与缩放功能。具体来说,我们将实现以下功能: 点击并拖动 outer 元素,可以移动整个块。点击并…

React学习路线

React基础 React 是一个用于构建用户界面的 JavaScript 库。它起源于 Facebook 的内部项目,现在已经成为前端社区中最受欢迎和广泛使用的库之一。以下是 React 的基础知识和核心概念: 1. JSX JSX 是 JavaScript XML 的缩写,是一种在 React…

C语言学习记录20240626

飞船无论朝哪边行驶,都能通过结构体记录获取它的初始坐标、转向角度和在该方向行进的距离,需要根据这些信息计算飞船移动后的坐标。 向量(vector)指具有大小(magnitude)和方向(direction)的量,可以理解为有方向的线段。 标量或纯量(scalar)指…

【嵌入式 RT-Thread】一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路

rt-thread 中的信号量和互斥锁在工业开发项目中的应用,本博文主要介绍了一种优雅的使用 [互斥锁] 和 [信号量] 解决数据多路并发思路 2024-06 by 积跬步、至千里 目录 0. 个人简介 && 授权须知1. 工业场景描述1.1 工业数据采集需求1.2 总线协议与数据采集 2…

汇聚荣做拼多多运营,是新手怎么做?

作为电商领域的一颗新星,拼多多以其独特的商业模式迅速崛起,吸引了众多商家和消费者的目光。对于新手来说,如何在拼多多平台上开展运营活动,成为了许多初入电商领域的人们关心的问题。本文将围绕如何做好拼多多运营这一核心内容&a…

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…

基于Springboot+Vue的校友社交系统(带1w+文档)

基于SpringbootVue的校友社交系统(带1w文档) 校友社交系统作为一种典型的管理系统也迅速的发展并深入人们的日常生活中,它使用户足不出户就可以管理自己的校友社交信息等,最大化减缩了用户的管理时间,提高了管理效率。 项目简介 基于SSMVUE的…

【小学期】操纵数据的DAO设计——以学生管理系统为例

项目结构 student_management │ ├── src │ ├── model │ │ ├── Student.java │ │ └── StudentDAO.java │ │ │ ├── view │ │ └── StudentView.java │ │ │ ├── controller │ │ └── StudentController.java │…

基于百度地图实现矩形绘制/电子围栏/自定义覆盖物选择、点击、区域选中、轨迹绘制

目录 开发前的准备账号注册页面创建地图初始化矩形绘制开启绘制模式监听绘制完成事件矩形取消事件自定义覆盖物渲染数据准备覆盖物渲染自定义点击事件优化用户刷新提供的覆盖物添加右键菜单轨迹绘制开发前的准备 账号注册 百度地图开发者平台点此访问 登录注册后点击右上角的控…

keepalived 服务高可用(简约版)

本文基于centos 7记述如何使用keepalived 背景 为生产环境准备一台备机是极其必要的,防止主机宕掉无服务可用的情况出现。但是同一局域网内每台主机都分配了一个唯一IP,这些IP既然相互不同,那么服务请求的时候岂不是要切换IP地址&#xff1f…

任务5.1 初识Spark Streaming

实战概述:使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架,用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统,能够处理流式数据并统计文本中的单词出现频…

allWebPlugin助力iWebOffice2015插件在高版本浏览器使用

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX插件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持谷歌、火狐等浏…

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…

vue2 + dataV 组件问题

在使用 dataV 过程中&#xff0c;遇见 svg 动画不加载问题。 一、理想状态下&#xff1a; 二、开发中遇到的 加载不出来问题。 解决方案 在查找官方资料中&#xff0c;提到使用 key 可以解决方案。 1 绑定 key 2 改变 key 值 注意&#xff1a;一定要在 $nextTick 里面执…

理解论文笔记:基于AHP和模糊综合评价的无线传感器网络可维护性评估方法

作为一个研0的娃,这是我认真读的第一篇论文,想着笔记让自己能看懂。如有侵权,请联系删除。 I. INTRODUCTION 介绍 主要介绍了无线传感器网络可维护性研究的重要性和必要性,并对下面的各章进行了总结。 翻译:第二部分简要介绍了无线传感器网络的维护,并对影响系统的因素…

VS 在多线程中仅调试某个线程

调试多线程程序时&#xff0c;只想观察某个线程的运行情况&#xff1b; 但是&#xff0c;由于线程切换执行&#xff0c;会导致调试时焦点在几个代码块之间跳来跳去&#xff0c;故需要解决这个问题。 参考文章&#xff1a; C#使用线程窗口调试多线程程序。 1 打开线程窗口&…