关于Session

关于http协议后面会有一系列文章专门介绍。这里就大概了解一下:首先需要知道一点:HTTP是无状态的

什么是无状态呢?

客户与服务器建立连接、发出请求、得到响应、关闭连接。整个流程走完就算完了。下次服务器并不知道是否跟客户打过交道。

简言之,对于容器而言,每一个请求都来自于一个新的客户。

怎么让服务器记住你?

对于客户的一个请求,容器会生成一个唯一的ID,并通过响应把它返回给客户。客户再在以后的每一个请求中发回这个会话ID。容器看到此ID后,会找到响应的匹配的画画,并把这个会话与请求关联。而交换会话ID的最简单也最常用的方式是通过cookie。

cookie是谁来管理的?

容器会做cookie的所有工作。包括:生成会话ID,创建新的cookie对象,把会话ID放在cookie中,把cookie设置为响应的一部分。

在响应中发送一个会话

HttpSession session = request.getSession();

如何判断会话已经存在还是刚刚创建?

session.isNew();//如果是刚创建的会返回true,反之则为false

只想要已经有的会话怎么办?

对此,专门有一个重载的方法getSession(boolean),如果不想创建一个新的会话,可以调用getSession(false),此会话要么返回null,要么返回一个已经有的HttpSession。

如果客户不接受cookie怎么办?

如果客户禁用cookie,则意味着getSession()总会返回一个新的会话,客户不会发回一个带有会话ID cookie首部的请求。

此时可以使用URL重写。

我们的目的是为了让容器和客户交换会话ID信息,最简单的方法当然是用cookie。但是此时如果不能把ID放在cookie中,怎么办?只有利用URL重写将cookie会话中的会话ID取出来放在访问应用的各个URL的最后。

会话怎么删除?

会话对象会占用资源,所以必须要让没用的对话删除。

那么问题来了?怎么才能让容器知道你什么时候删除一个对话呢?或者什么时候客户已经离开了?容器又在什么时候删除这个对话呢?

这个时候要用到HttpSession接口了。他有一些很有用的方法可供调用。

getCreationTime():返回第一次创建对话的时间。**可以用它来得出对话存在的时间。**

getLastAccessedTime():返回容器最后一次得到包含这个会话ID请求后过去了多长时间。**可用来得出客户最后一次访问这个对话是什么时候**。

setMaxInactiveInterval():指定对于这个会话客户请求的最大间隔时间。**可以用来撤销容器中废弃的会话**。

getMaxInactiveIntervale():返回这个会话客户请求的最大间隔时间。

invalidate():结束会话。

所以会话通常有三种死法:

  • 超时

  • 你在会话对象上调用validate

  • 应用结束(崩溃或者取消部署)

1.在DD中配置会话超时

<web-app ....>
<servlet>
...
</servlet>
<session-config>
<session-timeout>15</session-timeout>
<!--15分钟超时-->
</session-config>
</web-app>

2.设置一个特定会话超时

session.setMaxInactiveInterval(20*60);//20 minutes

关于Cookie

cookie还有什么别的作用?

前面提到了cookie可以帮助容器记住会话状态,那么除此之外还能干什么呢?

默认,cookie与会话寿命一样长,一旦客户离开浏览器,cookie就会消失。但是你可以让cookie活的更长一些,甚至在关闭浏览器之后还能存活。

创建一个cookie:

Cookie cookie = new Cookie("username", name);

设置Cookie在客户端上存活多久:

cookie.setMaxAge(30*60);//30 minutes

把Cookie发送到客户:

response.addCookie(cookie);

从客户请求得到cookie:

Cookie[] cookie = request.getCookies();
for(int i= 0;i < cookies.length; i++) {
Cookie cookie = cookies[i];
if(cookie.getName().equals("username")) {
String userName = cookie.getValue();
break;
}
}

HttpSessionBindingListener

这个监听器的作用是:当一个属性类实现了此接口是,这个实例增加到一个会话或者从一个会话中删除时,容器会调用该事件处理的回调方法。

代码示例:

public class ClassName implements HttpSessionBindingListener {
//省略其他属性方法定义,或者Setter、getter定义
public void valueBound(HttpSessionBindingEvent event) {
//添加处理事件
}
public void valueUnBound(HttpSessionBindingEvent event) {
//添加处理事件
}

会话迁移

在分布式应用上,应用的各个部分可以复制到网络的多个节点上,在一个集群环境中,容器可能会完成负载均衡,取得客户的请求并把它放在多个JVM上。

这个时候ServletContext, ServletConfig, HttpSession对象会发生什么变化呢?

答案是:每个VM上都有一个ServletContext。每个VM上的每个Servlet有一个ServletConfig。但是每个Web应用的一个给定的会话ID,只有一个HttpSession对象,而不论应用分布在多少个VM上

所以尽管应用的其他部分会在每个节点VM上复制,但是会话对象不会复制,只会迁移。

HttpSessionActivationListener

如果你的属性类型是Serializable,那就用不着该监听器了。如果不是,可以实现该监听器,使得属性实现串行化。

总结与会话相关的监听器

HttpSessionListener 

主要方法:sessionCreated sessionDestroyed

可以用来统计有多少个并发用户

HttpSessionBindingListener

HttpSessionBindingListener
//上面两种监听器,前面已经介绍,此处从略 HttpSessionAttributeListener 主要方法:attributeAdded() attributeRemoved() attributeReplaced() 可以知道会话中什么时候增加删除或者替换会话属性。

这是最后一篇关于Servlet基础知识的文章,通过三篇博客,大致介绍了Servlet的常用功能,我们知道怎么用它,但是具体Servlet的原理,请看第四篇。

Servlet 浅谈(三)的更多相关文章

  1. Servlet 浅谈(一)

    Servlet 的生命周期 类加载.实例化,init方法,service方法,destroy方法.关于这点,后面会有详细介绍. 什么是容器? 因为Servlet没有main方法,所以它受控于另一个Ja ...

  2. Servlet 浅谈(二)

    如何获取初始化参数 容器在初始化的时候,会为了这个Servlet创建一个唯一的ServletConfig,容器会从DD读出Servlet的初始化参数,并把这个参数交给ServletConfig,然后S ...

  3. salesforce lightning零基础学习(十) Aura Js 浅谈三: $A、Action、Util篇

    前两篇分别介绍了Component类以及Event类,此篇将会说一下 $A , Action以及 Util.  一. Action Action类通常用于和apex后台交互,设置参数,调用后台以及对结 ...

  4. 浅谈三款常用软件 - Chrome、Intellij IDEA、Cygwin

    作为一个每天的接触计算机的程序员,肯定也会接触形形色色的软件,不过今天在此介绍的三款软件,则是我每天都要用到的,而且我认为它们非常好用,极大的提高了我的开发效率. 1.Chrome Google的大名 ...

  5. python学习(28) 浅谈可变对象的单例模式设计

    python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...

  6. 浅谈 TCP、IP、DNS 和 HTTP 的关系

    一.浅谈三个协议的基本概念 1.IP 协议 按层次分,IP网际协议位于网络层,几乎所有的网络的系统都会用到 IP 协议,其重要性非同一般.IP 协议作用就是把各种数据包传送给对方,对方的地址就要看其 ...

  7. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  8. 浅谈Tomcat和Servlet

    本文浅谈下对Tomcat和Servlet总体的理解,初学时有用过一段时间,但当时疲于应对如何xml配置和使用,对他们的理解就像是一个黑匣子.现在回顾一下帮助自己加深网络的理解.开始还是先推荐我看的文章 ...

  9. 浅谈Kotlin(三):类

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 已经学习了前 ...

随机推荐

  1. 如何写一个数据库How do you build a database?(转载)

    转载自:http://www.reddit.com/r/Database/comments/27u6dy/how_do_you_build_a_database/ciggal8 Its a great ...

  2. IOS开发系列 --- 核心动画

    原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...

  3. javascript中base64和Gzip的使用

    一般的使用流程(4步): 服务器端将字符串Gzip压缩为 字节数组——>通过base64转为字符串(后传递到客户端)——>解码base64字符串为字节数组——>Gzip解码字节数组为 ...

  4. 一个完整的SSL连接建立过程

    客户端浏览器连接到Web服务器,发出建立安全连接通道的请求. 服务器接受客户端请求,发送服务器证书做为响应. 客户端验证服务器证书的有效性,如果验证通过,则用服务器证书中包含的服务器公钥加密一个会话密 ...

  5. CentOS minimal版安装图形界面的步骤(自动获取IP)

    1.连接网络: CentOS minimal.iso安装好后,进入终端,默认是不开网络的, 首先启用网卡, 自动获取ip. ifconfig eth0 up   www.2cto.com  dhcli ...

  6. shonc项目中的设计资讯模块 php 字符串操作与正则表达式 strip_tags preg_match

    问题:当description 内容要求description的值选用资讯内容的前50个汉字.资讯内容可能有图片. 此时需要对输出的内容进行处理 php 正则表达式处理,编辑器输出的内容 只取图片: ...

  7. NFC协议学习分享

    很多同学在学习NFC协议的时候,觉得NFC的规范从底层到上层的应有尽有,有点无处下手的感觉.这里就和大家分享下我曾经学习NFC规范的经验.如果有不对的地方,也请各位同学批评指正.NFC Forum中有 ...

  8. 时间TDateTime相当于是Double,即双精度数64位,终于查到它用11位表示e,53位表示精度(整数小数一起),最前面一位表示正负

    http://docwiki.embarcadero.com/RADStudio/Seattle/en/Internal_Data_Formats 关于Double的RTL函数,好像就一个:TrySt ...

  9. Inno Setup:卸载时判断要调用的dll是否存在

    原文 http://zwkufo.blog.163.com/blog/static/2588251201072581947474/ [Code]function SuiteRemovedAlert2: ...

  10. C++14介绍

    C++14标准是 ISO/IEC 14882:2014 Information technology -- Programming languages -- C++ 的简称[1]  .在标准正式通过之 ...