httpservletrequest获取不到登录的session_cookie和session是怎么交互的?
Http协议使用的是无状态连接,这样会造成什么问题呢?看如下Demo
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,当在一个请求中时HttpServletRequest中的信息可以共享,而在不同的请求中HttpServletRequest并不能共享,这样就会造成用户确实进行过登录操作,但是跳到购物车页面时发现并没有东西,应为应用并不知道访问这个页面的用户是谁。
对客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户。客户再在以后的每一个请求中发回这个会话ID。容器看到ID后,就会找到匹配的会话,并把这个会话与请求关联
果然能保存会话状态了,客户和容器如何交换会话ID信息呢?其实是通过cookie实现的
看上面能保存会话的代码,我们并没有对cookie进行操作啊,其实是容器几乎会做cookie的所有工作,从最开始的Servlet开始讲这些操作是如何实现的,先看一下Servlet执行过程
1.用户点击页面发送请求->Web服务器应用(如Apache)->Web容器应用(如tomcat)
2.容器创建两个对象HttpServletRequest和HttpServletResponse
3.根据URL找到servlet,并为请求创建或分配一个线程,将请求和响应对象传递给这个servlet线程
4.容器调用Servlet的service()方法,根据请求的不同类型,service()方法会调用doGet()和doPost()方法,假如请求是HTTP GET请求
5.doGet()方法生成动态页面,并把这个对象塞到响应对象里。容器有响应对象的一个引用
6.线程结束,容器把响应对象装换为一个HTTP请求,把它发回给客户,然后删除请求和响应对象
Spring MVC框架其实在Servlet上面封装了一层,当我们自己用Servlet编写程序时,可以从HttpServletRequest中获取HttpSession,如下
在响应中发送一个会话cookie
HttpSession session = req.getSession();
我们只需要写上述一行代码即可,来看看容器帮我们做了哪些事情
1.建立一个新的HttpSession对象
2.生成唯一的会话ID
3.建立新的Cookie对象
4.把会话Id放到cookie中
5.在响应中设置cookie
从请求得到会话ID
HttpSession session = req.getSession();
如上面用的方法,我们并没有直接从HttpServletRequest 中获取HttpSession
能直接获取到HttpSession,其实是框架帮我们执行了HttpSession session = req.getSession(),然后设置进来的。我们可以设置session的过期时间,以保证用户登录后长期不操作需要重新登录。
tomcat是用如下结构来保存session的
protected Map<String, Session> sessions = new ConcurrentHashMap<String, Session>()
值为会话id,session对象是保存一个会话的各种属性,就是你调用类似代码的时候
session.setAttribute("username", username);
可以设置很多个啊,你应该也猜到了,在tomcat中保存会话属性是用map来保存的
protected Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
如果我们不自己new cookie而通过req.getSession()来设置cookie,那么cookie的名字为
JSESSIONID,值为会话id,前面图片中有哈。
第一次登陆,reponse设置一个cookie( JSESSIONID=会话id)
以后每次登陆带着这个cookie,通过key为JSESSIONID拿到会话id,因为cookie可以设置很多个哈。
通过JSESSIONID就能拿到session了,拿到session你就能拿出来登陆设置的各种属性了哈,就能判断出来这个是哪个用户了。
概念就不说了,过程还没明白的可以留言哈。
httpservletrequest获取不到登录的session_cookie和session是怎么交互的?相关推荐
- yii2 获取同一个账号登录的所有session_前端登录方案?这一篇就够了
登录是每个网站中都经常用到的一个功能,在页面上我们输入账号密码,敲一下回车键,就登录了,但这背后的登录原理你是否清楚呢?今天我们就来介绍几种常用的登录方式. Cookie + Session 登录 T ...
- 页面获取Spring Security登录用户
1.在session中取得spring security的登录用户名如下: ${session.SPRING_SECURITY_CONTEXT.authentication.principal.use ...
- js 请求接口获取不到登录cookie xhrFields 配置
请求接口获取不到登录cookie, 首先看看是否加了xhrFields没有 如果加了,在看看他们加的位置对不对. 小心队友坑你就是这 xhrFields: {withCredentials: true ...
- 使用uc_authcode 获取论坛当前登录用户信息
目的:使用uc_authcode 获取论坛当前登录用户信息 曲折:看了Discuz官方的ucenter二次开发手册,其中的Example如下: if(!empty($_COOKIE['Example_ ...
- uniapp获取微信授权登录和手机号一键登录(保姆教程)
uniapp获取微信授权登录(保姆教程) 第一步 下载官方给的解密文件'mWXBizDataCrypt' 没有文件就复制该文件的代码创建一个 var crypto = require('crypto' ...
- Excel 2010 VBA 入门 056 获取当前Windows登录用户名(Environ)
目录 示例 Environ函数 获取所有的系统环境变量 示例 在许多时候,开发者希望能够获取当前Windows登录用户的信息,并以此信息决定用户的使用权限等.如何使用VBA获取Windows登录用户名 ...
- uniapp - 编译微信小程序项目的微信授权登录、获取微信手机号登录、最新版微信直接登录、手机与验证码登录的示例源码(适用于 uniapp 微信小程序项目,源代码直接开箱即用)超级详细的代码及注释
效果图 uniapp 项目编译微信小程序,一些常见的登录方式及源代码,示例代码干净整洁无BUG拿来即用. 本文示例实现了 uniapp 微信小程序项目的登录功能,包含微信授权登录.获取微信手机号登录. ...
- github获取token进行登录
前言: 作者:神的孩子都在唱歌 一个还在努力的编程小白 转载请标注来源 github获取token进行登录 一. 错误 二. 解决 三. 使用 一. 错误 我push分支的时候: git push o ...
- Jmeter接口实战(一)之获取token值登录
Jmeter接口实战(一)之获取token值登录 第一式:获取token值登录 文章目录 Jmeter接口实战(一)之获取token值登录 前言 一.效果图 二.token是什么 1.token定义 ...
最新文章
- Win7新手系列教程:从安装到简单使用(新人必读)
- 用时间分类能量再用能量分类时间
- 全球及中国微型风扇行业营销前景及发展趋势建议报告2022-2027年
- JQuery的$(document).ready(function(){})与JS的window.onload 的各自优势!
- 【解题报告】Leecode 643. 子数组最大平均数 I——Leecode 刷题系列
- iOS 仿淘宝实现商品规格图片的放大缩小功能
- python语言中文怎么读-python中文读什么
- R语言线性回归预测网页流量
- 离线手动更新卡巴斯基
- MySQL搭建主从(一主一从)
- 关于我在(PTA)程序设计类实验辅助教学平台的重修经历
- lqr matlab,MATLAB中的LQR函数用法
- Android 实现扫描二维码功能
- USI环旭电子推出信用卡大小的SiPSet笔记本电脑主板
- 区块链技术在食品供应链领域的应用
- 钱多多软件制作第一天
- 女生无法拒绝的表白拼图
- unbuntu 18.04 配置静态IP
- 使用PDF补丁丁批量导入书签的办法
- 3种较常用 文本编辑器 比较
热门文章
- java bar_Java Bar类代码示例
- vlan 优科r500_ruckus 常用配置方法
- 【刷算法】按照之字形打印二叉树
- rabbitMQ 常用api翻译
- Oracle数据库日常管理之数据备份,恢复及迁移 (第五讲 )
- js 计算当前时间的前n分钟或后n分钟的时间
- $(document).ready(function(){});不执行
- React中组件间通信的方式
- Ubuntu16.04安装QQ机器人
- unity创建项目报错:解决sentinel key not found (h0007) Unity