《Head First Servlets & JSP》-6-会话管理
容器怎么知道客户是谁
Http协议是无状态连接,客户浏览器与服务器建立连接、发出请求、得到响应,然后关闭连接。即,连接只针对一个请求/响应。
对容器而言,每个请求都来自于一个新的客户。
客户需要一个唯一的会话ID
IP不能唯一标示Internet上特定的用户
比如公司网络内的用户为一个IP;而IP地址也只是路由的地址;用户换了一台设备的情况;
- 客户和容器如何交互会话ID信息
容器必须以某种方式吧会话ID作为响应的一部分交给客户,而客户必须把会话ID作为请求的一部分发回;
最简单而且最常用的方式是通过cookie交换这个会话ID信息。
容器会做cookie所有的工作!
在响应中发送一个会话cookie:
HttpSession session=request.geteSession();
余下的所有事情都会自动发生:
你不用自己建立新的HttpSession对象;
你不必生成唯一的会话ID;
你不用自己建立新的Cookie对象;
你不用把会话ID与cookie关联;
你不用在响应中设置Cookie;
cookie的所有工作都在后台运行;从请求得到会话ID:
HttpSession session=request.geteSession();
与为响应生成会话ID和cookie时所用的方法完全一样!
即:
if(请求包含一个会话ID cookie){
找到与该ID匹配的会话;
}else if(没有会话ID cookie OR 没有与此会话ID匹配的当前会话){
创建一个新会话;
}
若不想新建会话
HttpSession session= request.getSession(false);
若只想要一个已经有的会话,若没有会话则返回null,若有会话存在则返回HttpSession。若用户不接受cookie
若用户没有启用cookie,则需要使用URL重写。在Tomcat中表现为URL+;jsessionid=1234567。
如果不能用cookie,而且只要告诉响应要对URL编码,URL重写才能奏效。
容器怎么知道cookie不能正常工作?
容器并不知道cookie是否工作,所以向客户返回第一个响应时,它会同时尝试cookie和URL重写这两种方式;
当用户发出下一个请求,它把会话ID追加到请求URL,若用户接受cookie,这个请求也会有一个会话ID cookie;
当servlet调用request.getSession()时,容器若从请求读取会话ID,则认为这个客户接受cookie,所以可以忽略response.encodeURL()调用。另一种URL重写
response.encodeRedirectURL("/BeerTest.do");
用于想把请求重定向到另一个URL,但是还是想使用一个会话。注意,若依赖会话,就要把URL重写作为一条后路;
另外,因为需要URL重写,就必须在响应HTML中动态生成URL,这意味着必须在运行时处理HTML。(当然,可以在JSP中完成URL重写。)
encodeURL()方法是HttpServletResponse对象上调用的方法,不能再请求上调用这个方法;URL编码只与响应有关。
关键的HttpSession方法
设置会话超时
- 会话有3中死法:
超时
在会话对象上调用invalidate()
应用结束(崩溃或取消部署)
- 在DD中配置会话超时
这与在会话上调用setMaxInactiveInterval()一样的效果。 设置一个特定会话的会话超时
cookie
cookie实际上就是用户和服务器之间交换的一小段数据(一个名/值String对);
服务器把cookie发送给客户,客户做出下一个请求时再把cookie返回给服务器。
与cookie相关的方法封装在3个类中:HttpServletRequest、HttpServletResponse和Cookie。
- cookie和首部
HttpSession对象的生命周期中的重要时刻:
注意,实现了HttpSessionBindingListener的属性类(如Dog类),不在DD中配置,因为它只与会话中的某个属性有关;
而HttpSessionListener和HttpSessionAttributeListener必须在DD中注册,因为它们会会话本身有关。
会话迁移【分布式Web应用的范畴】
分布式Web应用中,每次同一个客户做请求时,最后这个请求都有可能达到同一个servlet的不同实例;
即指向servlet A的请求A可能在一个VM中,而指向servlet A的请求B可能在另一个不同的VM中。
那么,ServletContext、ServletConfig和HttpSession对象如何表现?
答案:只有HttpSession对象(及其属性)会从一个VM中迁移到另一个VM中(即所有VM只有一个同样ID的HttpSession),其他对象复制(不同VM可能有多个这类对象)。
- 属性迁移
若属性是直接的Serializable对象,则该属性会自动在迁移时序列化,不用额外关心它。
若属性类型不是Serializable呢?那么为了迁移,需要让属性对象类实现HttpSessionActivationListener,并使用激活/钝化回调方法解决这个问题。
Listener示例
会话计数器
这个监听者允许你跟踪这个Web应用中活动会话的个数:
在DD中配置监听者:
注意:
属性监听者
这个监听者,当每一次向会话增加属性、删除属性或者替换属性时,都能被跟踪到。
在DD中配置监听者:
注意,System.out标准输出在Tomcat中默认输出到tomcat/logs/catalina.log中。
属性类(监听对它有影响的事件)
在DD中配置:
与会话相关的监听者
《Head First Servlets & JSP》-6-会话管理的更多相关文章
- [Servlet&JSP] HttpSession会话管理
我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性.假设用户关掉浏览器接受Cookie的功能.HttpSession也能够改用URL重写的方式继续其会话管理功能. HttpS ...
- HeadFirst Jsp 06 (会话管理)
现在我们希望能够跨多个请求保留客户特定的状态. 现在, 模型中的业务只是检查请求中的参数, 并返回一个响应(建议), 应用中没有谁记得在当前请求之前与这个客户之间发生过什么. 与一个客户的整个会话期间 ...
- 我的Java之旅 第七课 JAVA WEB 会话管理
1.隐藏域 隐藏域其实不是Servlet/JSP的会话管理机制的内容,但它能实现简单的页面状态记录的效果. 2.Cookie Cookie类 setMaxAge() 设置有效期 ...
- 10、会话管理/编程实战分析/Jsp
1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建C ...
- 【JSP&Servlet学习笔记】4.会话管理
Http本身是无状态通信协议,要进行会话管理的基本原理,就是将需要维护的状态回应给浏览器,由浏览器在下次请求时主动发送状态信息,让Web应用程序“得知”请求之间的关联. 隐藏字段是将状态信息以窗体中看 ...
- jsp/servlet学习三之会话管理初解
由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件 ...
- Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)
参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...
- shiro会话管理
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群. ...
- 【技巧总结】Penetration Test Engineer[4]-Web-Security(文件处理、会话管理、访问控制、SSRF、反序列化漏洞)
Web安全基础2 3.8.文件处理 1)文件上传 一个正常的业务需求,问题在于控制上传合法文件. 防御文件上传 客户端javascript校验(通常校验扩展名) 检查MIME类型 检查内容是否合法 随 ...
- shiro注解,初始化资源和权限,会话管理
有具体问题的可以参考之前的关于shiro的博文,关于shiro的博文均是一次工程的内容 注解: 新建一个类: 此时需要有admin的权限才可以执行下面的代码 public class ShiroS ...
随机推荐
- queue容器
一.queue特性 queue是一种先进先出(first in first out,FIFO)的数据结构,它有两个口,数据元素只能从一个口进,从另一个口出.队列只允许从队尾加入元素,队头删除元素,必须 ...
- 基于springboot+kotlin+gradle构建的框架的坑
项目采用以上技术构建,于是本人就尝试构建自己的脚手架,然后遇到一大推问题. 使用的是springinitials构建,IDE是:IDEA 现在也是知其然不知其所以然,但是先记录下来修改过程,以后等知识 ...
- java中io的详解
注:本文全篇转载于:http://blog.csdn.net/taxueyingmei/article/details/7697042,觉得讲的挺详细,就借过来看看,挺不错的文章. 先贴一张图 Jav ...
- IEEE1588精密网络同步协议(PTP)
1 引言 以太网技术由于其开放性好.价格低廉和使用方便等特点,已经广泛应用于电信级别的网络中,以太网的数据传输速度也从早期的10M提高到100M,GE,10GE.40GE,100GE正式产品也于20 ...
- Fiddler 使用技巧
1.Host重定向,将192.10.11.12:8091的地址重新定向到127.0.0.1:8080 if (oSession.host=="192.10.11.12:8091") ...
- Windows Server 2008 修改系统的SID
故事背景:用VMware搭建了几个操作系统相同的虚拟机.安装成功一台后,直接拷贝已经生成的VMDK文件来构建其它的虚拟机. 一般情况下,如果复制的各个虚拟机只是单独使用,并且这些虚拟机不加入到域(Ac ...
- web 应用 及 补充
Highcharts 绘图配置 的函数及参数 web页面文本框修饰器 --- KindEditor web页面 之 超人性的点赞与狂踩 web页面 之 图片上传 web页面 之 评论盖楼 jQuery ...
- 基于windows平台的命令行软件安装工具Chocolatey的安装
本文介绍Chocolatey的安装和使用 Chocolatey 这是基于.NET Framework 4以上的windows安装软件的命令行工具 安装 第一步,打开你的powershell.exe,使 ...
- 3.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html 概述 在文章:<[Spring学习笔记-MVC-3]SpringMVC返回Json数据-方 ...
- H.264学习笔记
1.帧和场的概念 视频的一场或一帧可用来产生一个编码图像.通常,视频帧可以分成两种类型:连续或隔行视频帧.我们平常看的电视是每秒25帧,即每秒更换25个图像,由于视觉暂留效应,所以人眼不会感到闪烁.每 ...