热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第六章会话管理(Session)

文章目录会话管理的概念和基本原理为什么进行会话管理会话管理的产生会话管理概念会话的实现过程•使用Cookie、隐藏域、URL重写实现会话管理会话管理:使用Cookie

文章目录

  • 会话管理的概念和基本原理
  • 为什么进行会话管理
      • 会话管理的产生
      • 会话管理概念
      • 会话的实现过程
  • • 使用COOKIE、隐藏域、URL重写实现会话管理
      • 会话管理:使用COOKIE
      • 示例:使用COOKIE实现用户登录
      • 创建并向客户端发送COOKIE
      • 从客户端读取COOKIE
      • COOKIE的方法
      • COOKIE的优缺点
      • 会话管理:使用隐藏的表单域
      • 会话管理:使用URL重写
  • • Session会话管理的原理和技术实现
      • Session
      • 示例:使用Session实现用户登录
      • 使用Session对象
      • 会话失效
      • Session与URL重写
      • Session的方法




会话管理的概念和基本原理
为什么进行会话管理

Web应用程序基于HTTP协议• HTTP基于请求/响应模式– 所有请求都是相互独立的,无连续性的• HTTP是无连接的协议– 限制每次连接只处理一个请求• HTTP是无状态的协议– 协议对于事务处理没有记忆能力

会话管理的产生

• 对于简单的页面浏览或信息获取,HTTP协议即可胜任– 浏览资讯– 查看在线图书目录
• 对于需要客户端和服务器端多次交互的网络应用,则必须记住客户端状态– 网上的购物车– 用户登录

会话管理概念

会话就是一个客户端连续不断地和服务器端进行请求/响应的一系列交互多次请求间建立关联的方式称为会话管理,或会话跟踪
– 会话状态,指服务器与浏览器在会话过程中产生的状态信息

会话的实现过程

HTTP没有提供任何记住客户端的途径,服务器如何建立、维护与客户端的会话
在这里插入图片描述
当服务器接收到客户端的首次请求时,服务器初始化一个会话并分配给该会话一个唯一标识符
– 在以后的请求中,客户端必须将唯一标识符包含在请求中,服务器根据此标识符将请求与对应的会话联系起来



• 使用COOKIE、隐藏域、URL重写实现会话管理

会话管理:使用COOKIE

• 所有的HTTP消息,不管是请求还是响应均包含头信息– 当服务器返回响应给客户端时,Servlet容器把会话的信息添加到响应头信息中– 客户端浏览器接收到响应后提取头信息,并将其存储在本地机中,以后发送请求时会自动将该信息带回服务器端• 浏览器存储在客户端机器上的头信息称作COOKIE,它以“属性名=属性值; …”方式组成文本信息

示例:使用COOKIE实现用户登录

在这里插入图片描述

创建并向客户端发送COOKIE

• 创建COOKIE对象
– 调用COOKIE的构造方法,给出COOKIE的名称和COOKIE的值,二者都是字符串COOKIE c = new COOKIE(“userName”,”a1234”)• 设置最大时效
– 如果要告诉浏览器将COOKIE存储到磁盘上,而非仅保存在内存中,使用setMaxAge方法(参数为秒数)
– c.setMaxAge(60*60*24*7)//一周(正数)• 将COOKIE放入到HTTP响应中
– 使用response.addCOOKIE(c)
– 如没有这一步,将不会有任何COOKIE被发送到浏览器

从客户端读取COOKIE

调用request.getCOOKIEs– 得到COOKIE对象组成的数组– 循环数组,调用每个对象的getName找到想要的COOKIE– 根据应用程序调用getValue方法使用这个COOKIE

COOKIE[] COOKIEs = request.getCOOKIEs();
if(COOKIEs != null)
{for(COOKIE COOKIE : COOKIEs){if("userId".equals(COOKIE.getName())){//doSomethingWith(COOKIE.getValue());}}
}

COOKIE的方法

• getMaxAge()/setMaxAge()– 读取/设置COOKIE到期时间(秒)• 如果值为0,表示删除对应的COOKIE• 如果值为负数,表示COOKIE只适用于当前的浏览会话• 默认值为-1• getName()– 读取COOKIE的名称。不存在setName方法• getValue()/setValue()– 读取/设置与COOKIE关联的值• 如果重新设置了某COOKIE的值,需要用addCOOKIE()方法将其发送回去

COOKIE的优缺点

• 优点– 可配置到期规则,数据可持久保存– 不需要服务器资源,数据保存在客户端– 简单性,基于文本的Key-Value对
• 缺点– 大小受到限制(总数300;20/站点;4KB/COOKIE)– 用户可禁用客户端接收COOKIE的功能– 潜在的安全风险

会话管理:使用隐藏的表单域

• 思想
– 通过使用隐藏域,由浏览器主动告知服务器多次请求间必要的信息,如在线问卷作答• 优点
– COOKIE被禁用或者根本不支持的情况下依旧能够工作• 缺点
– 关掉网页后会遗失先前的请求信息
– 所有的页面必须是表单提交之后的结果

在这里插入图片描述

会话管理:使用URL重写

• 思想
– 当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给
浏览器,超链接中包括请求参数信息– 由于GET方式发送请求,通常URL重写用于简单客户端信息保留,或辅助
Session会话管理

在这里插入图片描述



• Session会话管理的原理和技术实现

Session

在Servlet中进行会话管理,可以使用HttpServletRequest的getSession()方法取得HttpSession对象(简称为Session),通过设置/获取服务器端Session对象的属性,来保留请求之间的相关信息

在这里插入图片描述

Servlet容器提供Session接口来代表服务器端和客户端的会话

– 当一个WEB服务器为客户端开始一个会话时,创建一个新的Session对象(含有特殊ID,称为Session ID,默认用COOKIE存放在浏览器中。在Tomcat中,COOKIE的名称为JSESSIONID)

在这里插入图片描述

Session将数据存储在服务器的内存中,供以后来自同一个客户端的请求使用

在这里插入图片描述

示例:使用Session实现用户登录

在这里插入图片描述

使用Session对象

• 通常分三个步骤– 获取一个与请求相关联的会话• HttpSession session = request.getSession();– 从Session中设置或获取一个属性• session.setAttribute(“userName”,userName);• session.getAttribute(“userName”);– 根据需要关闭会话• session.invalidate();• 通常客户端不提供结束会话的通知,而是Servlet容器在用户处于一段非活动期后就会自动的使会话失效——这个时间段称为会话的超时期

会话失效

• Session对象失效:当用户超出指定会话期时间处于非活动状态时,会话自动结束– setMaxInactiveInterval(),设置会话的超时期– 通过web.xml的标签设置– 使用方法invalidate()• COOKIE失效– 默认关闭浏览器COOKIE消失– 在web.xml中设定存储Session ID的COOKIE存活期限

Session与URL重写

当用户浏览器禁用COOKIE时,仍打算运用Session来进行会话管理,可以对所有的URL使用URL重写

在这里插入图片描述

Session的方法

• getAttribute() – 从会话对象中提取出一个之前存储的属性值 •如果没有找到与名称相关联的值,则返回null• setAttribute() – 设置会话对象的属性名称和属性值• removeAttribute() – 移除与名称关联的值• getAttributeNames() – 返回会话中所有属性的名称• getId() – 返回唯一的标识符• isNew() – 确定会话对于客户来说是否为新创建• getCreationTime() – 返回会话创建的时间• getLastAccessedTime() – 返回客户端最近一次发送请求的时间• getMaxInactiveInterval()、 – 取得或设置会话的超时期setMaxInactiveInterval() • invalidate() – 废弃当前的会话


推荐阅读
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 跨站的艺术XSS Fuzzing 的技巧
    作者|张祖优(Fooying)腾讯云云鼎实验室对于XSS的漏洞挖掘过程,其实就是一个使用Payload不断测试和调整再测试的过程,这个过程我们把它叫做F ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • springboot基于redis配置session共享项目环境配置pom.xml引入依赖application.properties配置Cookie序列化(高版本不需要)测试启 ... [详细]
  • IamgettingaUnicodeerror:UnicodeEncodeError:charmapcodeccantencodecharacteru\xa9in ... [详细]
  • 这篇文章主要介绍PHP如何使用在全部作用域中始终可用的内置变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要 ... [详细]
author-avatar
停止离开静悄悄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有