《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时所用的方法完全一样!

即:

  1. if(请求包含一个会话ID cookie){
  2. 找到与该ID匹配的会话;
  3. }else if(没有会话ID cookie OR 没有与此会话ID匹配的当前会话){
  4. 创建一个新会话;
  5. }
  • 若不想新建会话

    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中死法:
  1. 超时
  2. 在会话对象上调用invalidate()
  3. 应用结束(崩溃或取消部署)
  • 在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-会话管理

时间: 2024-10-12 18:33:45

《Head First Servlets & JSP》-6-会话管理的相关文章

[Servlet&JSP] HttpSession会话管理

我们能够将会话期间必须共享的资料保存在HttpSession中,使之成为属性.假设用户关掉浏览器接受Cookie的功能.HttpSession也能够改用URL重写的方式继续其会话管理功能. HttpSession的使用 在Servlet/JSP中.假设要进行会话管理,能够使用HttpServletRequest的getSession()方法取得HttpSession对象.语句例如以下: HttpSession session = request.getSession(); getSession(

session management会话管理的原理

web请求与响应基于http,而http是无状态协议.所以我们为了跨越多个请求保留用户的状态,需要利用某种工具帮助我们记录与识别每一次请求及请求的其他信息.举个栗子,我们在淘宝购物的时候,首先添加了一本<C++ primer>进入购物车,然后我们又继续去搜索<thinking in java>,继续添加购物车,这时购物车应该有两本书.但如果我们不采取session management会话管理的话,基于http无状态协议,我们在第二次向购物车发出添加请求时,他是无法知道我们第一次添

《Head First Servlets & JSP》-6-会话管理-listener etc. demo

工程结构 上下文参数示例 示例程序展示了如何从上下文读取参数,并在上下文监听器中生成属性对象和在上下文中设置属性. 建立一个简单的JavaBean对象作为属性:Dog.java package com.example.entities; /** * Created by LTN on 2016/11/2. */ public class Dog { private String breed; public Dog(String breed) { this.breed = breed; } pub

10、会话管理/编程实战分析/Jsp

1 会话管理回顾 会话管理 1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术: 会话数据保存在浏览器客户端. Cookie核心的API: 2.1 在服务器端创建Cookie对象 Cookeie cookie = new Cookie("name","value"); 2.2 把cookie发送给浏览器端(通过响应头:set-cookie) response.addCookie(cookie); 2.3 浏览器带着cookie信息

jsp/servlet学习三之会话管理初解

由于http的无状态性,使得会话管理或会话跟踪成为web应用开发一个无可避免的主题.默认下,一个web服务器无法区分一个http请求是否为第一次访问.例如,一个web邮件应用要求用户登陆后才能查看邮件,因此,当用户输入了相应的用户名和密码后,应该不应该再次提示需要用户登陆,应该必须记住那些用户已经登陆.换句话说,应该必须能管理用户的会话. URL重写 URL重写是一种会话跟踪技术,它将一个或者多个token添加到URL的查询字符串中,每个token通常为key=value形式,如下: url?k

《Head First Servlets & JSP》-5-属性和监听

Servlet初始化参数 在DD文件(web.xml)中 Servlet参数在 在Servlet代码中 在Servlet初始化之前不能使用Servlet初始化参数 一旦有了一个ServletConfig引用,就可以调用getInitParameter()方法,不过 不能从构造函数调用这个方法!因为容器只调用构造函数还未调用init()之前,它还不算一个完整的Servlet(薛定谔Servlet). Servlet初始化参数只能赌一次--就是在容器初始化Servlet的时候 容器建立一个Servl

Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url-rewriting Java Web应用程序中的会话管理(Session Management)是一个非常有趣的话题.Java Servlet中的会话通过不同的方式进行管理,例如Cookie,HttpSession API,URL重写等. 这是Java Web应用程序系列教程中的第三篇文章,您可能

第十章 会话管理——《跟我学Shiro》

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理.会话事件监听.会话存储/持久化.容器无关的集群.失效/过期支持.对Web的透明支持.SSO单点登录的支持等特性.即直接使用Shiro的会话管理可以直接替换如Web容器的会话管理. 会话 所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据.如访问一些网站时登录成功后,网站可以记住用

《Head First Servlets & JSP》-13-过滤器和包装器

过滤器是什么 与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获和处理清求,另外 servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应. 容器根据DD中的声明来确定何时调用过滤器.在DD中,部署人员要建映射.明确对于哪个请求URL模式要调用哪些过滤器.所以,要由部署人员(而不是程序员)来确定哪些请求或响应应当由哪些过滤器处理. 过滤器要做的事情 只有一个过滤器接口:Filter,根据使用方式,可完成诸如以下工作: 请求过滤器可以完成