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失效,以保证用户信息安全,同时提高服务器的效率。

转载于:https://www.cnblogs.com/deng-cc/p/7462894.html

[05] Session概要相关推荐

  1. Rails5 Controller Document

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

  2. python自动测试p-python 自动化测试 pytest 的使用

    pytest 是一款以python为开发语言的第三方测试,主要特点如下: 比自带的 unittest 更简洁高效,兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件, ...

  3. 收发邮件服务器错误,邮件系统收发邮件报错汇总——错误代码550

    2013-11-22 10:02 您好,请教一个 Mdaemon 的问题:SMTP session terminated,具体log如下:|@|Thu 2013-11-21 18:44:23: --- ...

  4. 全网最全pytest大型攻略,单元测试学这就够了

    pytest 是一款以python为开发语言的第三方测试,主要特点如下: 比自带的 unittest 更简洁高效,兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件, ...

  5. 数据圈最全的数据产品文章全集

    大家好!今天给大家一个我的老朋友:「一个数据人的自留地」,数据人自留地是一个集数据产品.数据分析.数据仓库.产品策略与一体的数据人专属社群.创始人大鹏老师,拥有8年的数据经验,现在是人人都是产品经理专 ...

  6. Hibernate-基础学习

    一.概括 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行, ...

  7. c#开发电子商务网站---我的笔记

    2019独角兽企业重金招聘Python工程师标准>>> 电子商务网站(C#版) 通过一个在线的电子商务网站(网上书店销售系统)的实例,来讲述如何采用ASP.NET 3.5+SQL S ...

  8. linux停止java定时任务,linux定时任务生产java服务无法执行问题案例

    我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器 于是就在crontab里配置了如下内容: * * - root /usr/local/bin/resin_re ...

  9. 2022面试200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring

    200题目和答案分布式+微服务+MYSQL+Redis+JVM+Spring等等 带图MD在资源https://download.csdn.net/download/m0_47987937/86509 ...

最新文章

  1. 高校新校园网络系统设计方案
  2. multipart/form-data和application/x-www-form-urlencoded的区别
  3. (2)ARM Cortex-M3指令集
  4. 一些Python情结
  5. sigmoid function vs softmax function
  6. sql server中创建数据库和表的语法
  7. MySQL json-table-functions
  8. [转载]Hamachi 安装过程
  9. Windows驱动——利用WinDriver开发PCI设备驱动程序
  10. js排序算法详解-计数排序
  11. 用户如何设置浏览器主页的历史记录和管理加载项
  12. cognos数据源配置修改oracle,Cognos 新建数据源报错(原创)
  13. 如何备份android,如何备份安卓手机系统
  14. Java简单循环依赖的解决 —— spring_imitate(Spring的模仿)
  15. python解高次方程的解法_Python退火算法在高次方程的应用
  16. C语言学习日记(yzy):socket(TCP)网络连接
  17. 什么是“荷花定律”?
  18. UBUNTU开启CRONTAB日志记录及解决NO MTA INSTALLED, DISCARDING OUTPUT问题
  19. 基于macos M1 python3.8的tensorflow安装(简单方便几步完成)
  20. live555 android,live555

热门文章

  1. 多进程 VS 多线程
  2. Eclipse中使用自己的makefile管理工程
  3. Python正则表达式如何进行字符串替换
  4. [react] react声明组件有哪几种方法,各有什么不同?
  5. [react-router] React-Router 4中<Router>组件有几种类型?
  6. javascript学习系列(18):数组中的include方法
  7. 前端学习(3122):react-hello-react总结state
  8. 前端学习(2948):webpack创建简单项目
  9. [html] 怎样使用iframe刷新父级页面
  10. [html] 使用svg画一个爱心