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是怎么交互的?相关推荐

  1. yii2 获取同一个账号登录的所有session_前端登录方案?这一篇就够了

    登录是每个网站中都经常用到的一个功能,在页面上我们输入账号密码,敲一下回车键,就登录了,但这背后的登录原理你是否清楚呢?今天我们就来介绍几种常用的登录方式. Cookie + Session 登录 T ...

  2. 页面获取Spring Security登录用户

    1.在session中取得spring security的登录用户名如下: ${session.SPRING_SECURITY_CONTEXT.authentication.principal.use ...

  3. js 请求接口获取不到登录cookie xhrFields 配置

    请求接口获取不到登录cookie, 首先看看是否加了xhrFields没有 如果加了,在看看他们加的位置对不对. 小心队友坑你就是这 xhrFields: {withCredentials: true ...

  4. 使用uc_authcode 获取论坛当前登录用户信息

    目的:使用uc_authcode 获取论坛当前登录用户信息 曲折:看了Discuz官方的ucenter二次开发手册,其中的Example如下: if(!empty($_COOKIE['Example_ ...

  5. uniapp获取微信授权登录和手机号一键登录(保姆教程)

    uniapp获取微信授权登录(保姆教程) 第一步 下载官方给的解密文件'mWXBizDataCrypt' 没有文件就复制该文件的代码创建一个 var crypto = require('crypto' ...

  6. Excel 2010 VBA 入门 056 获取当前Windows登录用户名(Environ)

    目录 示例 Environ函数 获取所有的系统环境变量 示例 在许多时候,开发者希望能够获取当前Windows登录用户的信息,并以此信息决定用户的使用权限等.如何使用VBA获取Windows登录用户名 ...

  7. uniapp - 编译微信小程序项目的微信授权登录、获取微信手机号登录、最新版微信直接登录、手机与验证码登录的示例源码(适用于 uniapp 微信小程序项目,源代码直接开箱即用)超级详细的代码及注释

    效果图 uniapp 项目编译微信小程序,一些常见的登录方式及源代码,示例代码干净整洁无BUG拿来即用. 本文示例实现了 uniapp 微信小程序项目的登录功能,包含微信授权登录.获取微信手机号登录. ...

  8. github获取token进行登录

    前言: 作者:神的孩子都在唱歌 一个还在努力的编程小白 转载请标注来源 github获取token进行登录 一. 错误 二. 解决 三. 使用 一. 错误 我push分支的时候: git push o ...

  9. Jmeter接口实战(一)之获取token值登录

    Jmeter接口实战(一)之获取token值登录 第一式:获取token值登录 文章目录 Jmeter接口实战(一)之获取token值登录 前言 一.效果图 二.token是什么 1.token定义 ...

最新文章

  1. Win7新手系列教程:从安装到简单使用(新人必读)
  2. 用时间分类能量再用能量分类时间
  3. 全球及中国微型风扇行业营销前景及发展趋势建议报告2022-2027年
  4. JQuery的$(document).ready(function(){})与JS的window.onload 的各自优势!
  5. 【解题报告】Leecode 643. 子数组最大平均数 I——Leecode 刷题系列
  6. iOS 仿淘宝实现商品规格图片的放大缩小功能
  7. python语言中文怎么读-python中文读什么
  8. R语言线性回归预测网页流量
  9. 离线手动更新卡巴斯基
  10. MySQL搭建主从(一主一从)
  11. 关于我在(PTA)程序设计类实验辅助教学平台的重修经历
  12. lqr matlab,MATLAB中的LQR函数用法
  13. Android 实现扫描二维码功能
  14. USI环旭电子推出信用卡大小的SiPSet笔记本电脑主板
  15. 区块链技术在食品供应链领域的应用
  16. 钱多多软件制作第一天
  17. 女生无法拒绝的表白拼图
  18. unbuntu 18.04 配置静态IP
  19. 使用PDF补丁丁批量导入书签的办法
  20. 3种较常用 文本编辑器 比较

热门文章

  1. java bar_Java Bar类代码示例
  2. vlan 优科r500_ruckus 常用配置方法
  3. 【刷算法】按照之字形打印二叉树
  4. rabbitMQ 常用api翻译
  5. Oracle数据库日常管理之数据备份,恢复及迁移 (第五讲 )
  6. js 计算当前时间的前n分钟或后n分钟的时间
  7. $(document).ready(function(){});不执行
  8. React中组件间通信的方式
  9. Ubuntu16.04安装QQ机器人
  10. unity创建项目报错:解决sentinel key not found (h0007) Unity