1、Session是什么

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态,即Session是服务器端使用的一种保存客户端状态的机制。Cookie在客户端,Session在服务器端。

围绕以上的概念来说,其实Session还包含不同的语义:


(1)Session会话
我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。即客户端向服务器发送请求,服务器接收请求并生成响应返回给客户端,这样一次连续的调用过程。

从这个语义出发,就涉及到所谓Session持续的时间,以及Session过程中发生了什么操作等。

(2)Session作用域
其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。

从这个语义出发,则涉及到Session中存放什么内容,如何根据键值从Session中获取匹配的内容等。

(Session的实现机制,以及和Cookie的区别,存在的价值,本篇暂不展开,会在后面的文章中单独拿出来解释)

2、HttpSession接口

在Servlet API中,定义了HttpSession接口,用来封装会话对象。

2.1 会话对象的获取

因为该接口类型的对象是由容器创建的,所以不能直接使用new进行创建,而要使用HttpServletRequest中的方法进行获取
  • public HttpSession getSession()  获取当前请求相关的Session,若不存在则新建后返回
  • public HttpSession getSession(boolean create)  若参数为true,则等同getSession();若为false,则Session不存在时返回null,而不会新建

下面是HttpSession接口中定义的部分方法:
返回值     方法名     说明
void     setAttribute(String key, Object value) 以key/value的形式保存对象值    
Object     getAttribute(String key) 通过key获取对象值
void     removeAttribute(String key) 通过key删除属性
int     getMaxInactiveInterval()     获取session的有效非活动时间,以秒为单位
void     setMaxInactiveInterval(int interval) 设置session的最大非活动时间,以秒为单位,超时则销毁
String     getId()     获取session对象的编号
void     invalidate() 设置session对象失效
boolean     isNew()     判断一个session是不是一个新创建的会话对象

HttpSession中定义了三个与属性相关的方法,get / set / remove Attribute,分别用来 获取 / 设置 / 删除 属性。

这三个方法的声明和 HttpServletRequest 中与属性相关的方法是相同的,主要区别在于:
  • 有效范围不同
  • 请求中的属性只在当前请求内有效,只有通过转发才能把当前请求对象转发到下个资源
  • 会话属性在会话对象中有效,即客户端和服务器连接后,只要没有关闭浏览器,服务器也正常,则在该次会话中属性一直有效

另,由于会话对象有效时间长,安全性相对较低,所占资源较多。所以,请求属性能解决的问题,就用请求对象,必须时才使用会话。

2.2 会话失效

会话对象是容器创建的,并保存在容器中。

若客户端连接到服务器后却置之不理,不做任何操作,那么容器维护这些会话对象将占用很多资源。因此,容器会在会话对象闲置默认时间后销毁会话对象,多数容器默认30min销毁会话对象。所谓闲置,就是没有使用Session对象。

有三种方式配置会话的失效时间:

(1)在web.xml中配置,如下图配置闲置50min销毁
<session-config>
<session-timeout>50</session-timeout>
</session-config>
3
 
1
<session-config> 
2
    <session-timeout>50</session-timeout>
3
</session-config>

(2)使用setMaxInactiveInterval设置最长有效时间
HttpSession接口提供了setMaxInactiveInterval方法用以设定session的有效时间,以秒为单位,若形参为负数,则表示永不失效。

如设置会话有效时长为2小时:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() running...");
HttpSession session = request.getSession();
session.setMaxInactiveInterval(2*60*60);
}
 
1
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
2
    System.out.println("doGet() running...");
3
    HttpSession session = request.getSession();
4
    session.setMaxInactiveInterval(2*60*60);
5
}

如果用以上两种方式同时设置Session的有效时间,则以设定的较小的时间为准。

需要注意的是,上面这两种方式还是有区别的:
  • web.xml中配置有效时间是针对当前应用下的所有session,而setMaxInactiveInterval方法只是针对单独的某个session对象
  • web.xml中设置时间单位是min,而setMaxInactiveInterval设置时间单位是sec

(3)使用invalidate立即失效
除了根据有效时间使会话失效之外,还可以调用HttpSession中的invalidate方法,使会话立即失效。

我们在涉及账户登录后常常用到session保存部分用户信息,在用户选择登出时,就要使用invalidate让session失效,以保证用户信息安全,同时提高服务器的效率。


[05] Session概要的更多相关文章

  1. Hibernate 系列 05 - Session 类

    引导目录: Hibernate 系列教程 目录 前言: Session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关. 就如同在编写JDBC时需要关 ...

  2. session概要

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况 下).因此,在需要保存用户数据时,服 ...

  3. 编程从入门到提高,然后放弃再跑路(Java)

    1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利用p ...

  4. 编程从入门到放弃(Java)

      1.Java入门篇 1.1 基础入门和面向对象 1.1.1 编程基础 [01] Java语言的基本认识 [02] 类和对象 [03] 类的结构和创建对象 [04] 包和访问权限修饰符 [05] 利 ...

  5. 关于Session的概念和测试点

    Session概要 Session 是用于保持状态的基于 Web 服务器的方法,在 Web 服务器上保持用户的状态信息供在任何时间从任何页访问. Session 允许通过将对象存储在 Web 服务器的 ...

  6. 从零开始写一个发送h264的rtsp服务器(上)

    转自:http://blog.csdn.net/jychen105/article/details/47006345 一.什么是RTSP 通常所说的rtsp协议其实包含三个协议: rtsp协议, rt ...

  7. Rails5 Controller Document

    更新: 2017/06/28 大致完成全部 更新: 2017/06/29 补充module文件命名规则 更新: 2017/07/09 补充session的设置 更新: 2018/03/06 修正ren ...

  8. Hibernate 系列 学习笔记 目录 (持续更新...)

    前言: 最近也在学习Hibernate,遇到的问题差不多都解决了,顺便把学习过程遇到的问题和查找的资料文档都整理了一下分享出来,也算是能帮助更多的朋友们了. 最开始使用的是经典的MyEclipse,后 ...

  9. Tomcat服务器配置以及相关配置文件介绍

    摘自:http://blog.163.com/ny_lonely/blog/static/18892427320136925044357/ context.xml 文件   配置属性说明     用于 ...

随机推荐

  1. elastalert基于微信公众号报警

    环境部署 安装其它的必需包 yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel   1,下载. ...

  2. 大道至简第一章读后感——java伪代码形式

    大道至简这本书第一章在向读者展示编程的精义.开篇以愚公移山的例子来描述软件工程项目.愚公,作为一名工程名家,集项目组织者.团队经理.编程人员.技术分析师于一身,来领导工程的进行.下面我们来看看这个项目 ...

  3. Apache Storm 1.1.0 中文文档 | ApacheCN

    前言 Apache Storm 是一个免费的,开源的,分布式的实时计算系统. 官方文档: http://storm.apache.org 中文文档: http://storm.apachecn.org ...

  4. js获得时间new Date()整理

    Date对象取得年份有两种方法:getFullYear()和getYear() 经测试var dt = new Date(); //alert(new Date())弹出:Thu Aug 24 201 ...

  5. Pandas基础学习与Spark Python初探

    摘要:pandas是一个强大的Python数据分析工具包,pandas的两个主要数据结构Series(一维)和DataFrame(二维)处理了金融,统计,社会中的绝大多数典型用例科学,以及许多工程领域 ...

  6. bat调用kettle的job文件

    @bat set /p param=请输入时间:echo %param%F:cd D:/data-integrationecho 正在执行接口call Kitchen.bat/norep /file ...

  7. [转]RMI方式Ehcache集群的源码分析

    RMI方式Ehcache集群的源码分析   Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示:   Ehcache支持 ...

  8. c# 读取excel数据的两种方法(转)

    转载自:http://developer.51cto.com/art/201302/380622.htm, 方法一:OleDb: 用这种方法读取Excel速度还是非常的快的,但这种方式读取数据的时候不 ...

  9. webStrom2017.1版本如何添加vue.js插件

    第一步:打开webStrom-setting 第二步:选择File and Code Templates--点击左上角"+"号 第三步:在Name:vue File    Exte ...

  10. poj3463 最短路和比最短路长1的路径数

    这题需要很好的理解Dij. 在Dij的基础上,每个点多一个次短路的长度和数量进行控制. 那么在队列中,最短路控制时出现n次,次短路控制出现n次.注意松弛条件中val值和最短路.次短路的关系. 这题需要 ...