Session 是服务器端会话技术。当浏览器访问 Web 服务器的资源时,服务器可以为每个用户浏览器创建一个 Session 对象,每个浏览器独占一个 Session 对象。

由于每个浏览器独占一个 Session,所以用户在访问服务器的资源时,可以把数据保存在各自的 Session 中。当用户再次访问该服务器中的其它资源时,其它资源可以从 Session 中取出数据,为用户服务。

Session 的工作原理

Session 虽然属于服务端会话技术,但是它的实现离不开客户端浏览器和 Cookie 的支持,其工作原理如下。

  1. 当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID(用来标识这个 Session 对象);
  2. 服务器将 SessionID 以 Cookie(Cookie 名称为:“JSESSIONID”,值为 SessionID 的值)的形式发送给客户端浏览器;
  3. 客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie 随请求一起发送给服务器;
  4. 服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。

注意:

  • 流程中的 Cookie 是容器自动生成的,它的 maxAge 属性取值为 -1,表示仅当前浏览器有效。
  • 浏览器关闭时,对应的 Session 并没有失效,但此时与此 Session 对应的 Cookie 已失效,导致浏览器无法再通过 Cookie 获取服务器端的 Session 对象。
  • 同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象。

Session 与 Cookie 对比

Session 和 Cookie 都属于会话技术,都能帮助服务器保存和跟踪用户状态,但两者也存在差异,如下表。

不同点 Cookie Session
存储位置不同 Cookie 将数据存放在客户端浏览器内存中或硬盘上。 Session 将数据存储在服务器端。
大小和数量限制不同 浏览器对 Cookie 的大小和数量有限制。 Session 的大小和数量一般不受限制。
存放数据类型不同 Cookie 中保存的是字符串。 Session 中保存的是对象。
安全性不同 Cookie 明文传递,安全性低,他人可以分析存放在本地的 Cookie 并进行 Cookie 欺骗。 Session 存在服务器端,安全性较高。
对服务器造成的压力不同 Cookie 保存在客户端,不占用服务器资源。 Session 保存在服务端,每一个用户独占一个 Session。若并发访问的用户十分多,就会占用大量服务端资源。
跨域支持上不同 Cookie 支持跨域名访问。 Session 不支持跨域名访问。

Session API

Session 对象由服务器创建,通过 HttpServletRequest.getSession() 方法可以获得 HttpSession 对象,例如:

  • //获取session对象
  • HttpSession session=request.getSession();

HttpSession 接口定义了一系列对 Session 对象操作的方法,如下表。

返回值类型 方法 描述
long getCreationTime() 返回创建 Session 的时间。
String getId() 返回获取 Seesion 的唯一的 ID。
long getLastAccessedTime() 返回客户端上一次发送与此 Session 关联的请求的时间。
int getMaxInactiveInterval()  返回在无任何操作的情况下,Session 失效的时间,以秒为单位。
ServletContext getServletContext()  返回 Session 所属的 ServletContext 对象。
void invalidate()  使 Session 失效。
void setMaxInactiveInterval(int interval) 指定在无任何操作的情况下,Session 失效的时间,以秒为单位。负数表示 Session 永远不会失效。

设置 Session 过期时间

Session 对象在服务器中驻留一段时间后没有被使用,就会被销毁,这个时间就是 Session 的过期时间。

Session 的默认过期时间为 30 分钟,我们可以通过如下两种方式设置过期时间。

1. 使用 <session-config> 元素

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!--设置session的过期时间-->
<session-config>
<session-timeout>10</session-timeout>
</session-config>
</web-app>

在 web.xml 中,使用 <session-config> 及其子元素 <session-timeout> 可以配置 Session 的默认过期时间,代码如下。

  • //设置会话的过期时间
  • request.getSession().setMaxInactiveInterval(100);

Session 的生命周期

Session 对象创建

Session 对象在容器第一次调用 request.getSession() 方法时创建。

值得注意的是,当客户端访问的 Web 资源是 HTML,CSS,图片等静态资源时,服务器不会创建 Session 对象。

Session 对象销毁

Session 对象在如下 3 种情况下会被销毁:

  • Session 过期;
  • 调用 session.invalidate() 方法,手动销毁 Session;
  • 服务器关闭或者应用被卸载。

Session 域对象

Session 对象也是一种域对象,它可以对属性进行操作,进而实现会话中请求之间的数据通讯和数据共享。

在 javax.servlet.http.HttpSession 接口中定义了一系列操作属性的方法,如下表。

返回值类型 方法 描述
void setAttribute(String name, Object o) 把一个 Java 对象与一个属性名绑定,并将它作为一个属性存放到 Session 对象中。
参数 name 为属性名,参数 object 为属性值。
Object getAttribute(String name) 根据指定的属性名 name,返回 Session 对象中对应的属性值。
void removeAttribute(String name) 从 Session 对象中移除属性名为 name 的属性。
Enumeration getAttributeNames() 用于返回 Session 对象中的所有属性名的枚举集合。 

Session 、request 以及 ServletContext 合称为 Servlet 的三大域对象,它们都能保存和传递数据,但是三者也存在许多差异,如下表。

不同 request Session ServletContext
类型 javax.servlet.http.HttpServletRequest javax.servlet.http.HttpSession javax.servlet.ServletContext
创建 客户端向容器发送请求时创建。 容器第一次调用 getSession() 方法时创建。 Servlet 容器启动时创建。
销毁 容器对这次请求做出响应后销毁。 Session 销毁的时机:

  • 关闭服务器或应用被卸载。
  • Session 过期,默认为 30 分钟。
  • 手动调用 session.invalidate() 方法进行销毁。
容器关闭或者 Web 应用被移除时销毁。
有效范围 只对当前请求涉及的 Servlet 有效。  Session 对本次会话期间的所有 Servlet 都有效。 对整个 Web 应用内的所有 Servlet 有效。
数量 Web 应用中的所有 Servlet 实例都可以有多个 request 对象。 Web 应用中可以有多个 Session,多个 Servet 实例可以共享同一 Session 对象。 在整个 Web 应用中只有一个 Context 对象。
数据共享 每一次请求都是一个新的 request 对象。
通过和请求转发的配合使用可以实现一次请求中 Web 组件之间共享的数据。
每一次会话都是一个新的 Session 对象。
通过 Session 域对象可以实现一次会话中的多个请求之间共享数据。
在一个应用中有且只有一个 Context 对象,作用于整个 Web 应用,可以实现多次会话之间的数据共享。

Servlet Session的使用的更多相关文章

  1. Servlet session

        一.session介绍 Session用于保存服务端与客户端"会话"的信息.例如你逛淘宝时添加到购物车中的商品的信息就是保存到Session中.与Cookies不同的是,S ...

  2. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  3. jsp&servlet——session监听

    session监听,需要实现HttpSessionAttributeListener接口 attributeAdded:监听添加session attributeRemoved:监听删除session ...

  4. Servlet Session 跟踪

    HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录. 但是仍然有以下三种方式来维持 ...

  5. Servlet session的理解

    servlet参见http://blog.csdn.net/bryanliu1982/article/details/5214899 session参见http://lavasoft.blog.51c ...

  6. Servlet Session MVC模式

    一   什么是Session 当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId). ...

  7. servlet session 相关

    1.session是server维护的一个变量,如果消除每个session?----这里只做指定key的session删除 1.1.显示调用 废除指定key的session session.remov ...

  8. 在报表中给session赋值实现报表间参数共享

    1. 问题描述 在报表开发工具FineReport中,若有几张不同的报表,每张报表都有一个共同的项可以选择,比如日期时间.我们希望选择了第一张报表的时间之后,其他报表的默认时间都变为第一张报表选择的时 ...

  9. Using Sessions and Session Persistence---reference

    Using Sessions and Session Persistence The following sections describe how to set up and use session ...

随机推荐

  1. SpringBoot整合MQTT (使用官方demo)

    依赖 <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse. ...

  2. 更快的Maven来了

    Maven经常被拿来和Gradle做对比,最大的劣势之一就是Maven构建慢,Gradle比Maven构建速度快2到10倍,而如今Maven也可以更快了.Apache Maven团队从Gradle和T ...

  3. java源码——两种格式日期的转换

    这里要实现1981.07.30 格式和July 30.1981格式的日期的转换. 在输入时进行日期格式的识别,并且对字符串进行操作并且输出. 难点在于字符串格式的识别和月份的转换,我用了正则表达式匹配 ...

  4. 【LeetCode】856. Score of Parentheses 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 递归 计数 日期 题目地址:https://le ...

  5. 「THUSCH 2017」大魔法师

    Description 大魔法师小 L 制作了 \(n\) 个魔力水晶球,每个水晶球有水.火.土三个属性的能量值.小 L 把这 \(n\) 个水晶球在地上从前向后排成一行,然后开始今天的魔法表演. 我 ...

  6. 5分钟搭建wordpress个人博客网站——宝塔傻瓜式部署,无坑系列,附赠主题和md插件[2021-12-31]

    一.前言 自从买了服务器,小编已经马不停蹄的学了两天服务搭建的知识,问了很多大佬,快速搭建自己的博客网站.有四种方式,我在这里全部分享给大家.自己已经搭建好,欢迎大家过来看一下,给你提供个思路哈! 小 ...

  7. [C++]C++四舍五入保留到n位小数

    #include <sstream> #include <iostream> #include <iomanip> using namespace std; /** ...

  8. CS5211替代兼容PS8625|普瑞PS8625替代方案|CapstoneCS5211

    PS8625是一个DP显示端口 到LVDS转换器芯片,利用GPU和显示端口(DP) 或嵌入式显示端口(eDP) 输出和接受LVDS输入的显示面板.PS8625实现双通道DP输入,双链路LVDS输出.P ...

  9. CSS3的nth-child() 选择器,表格奇偶行变色

    nth-child() 应用背景 CSS3的nth-child() 选择器,我之前很少用,在做表格偶数行变色的时候,我通常在绑定的时候,做一个js判断,来加一个css,从而使表格偶数行和奇数行颜色不一 ...

  10. [学习笔记] Oracle运算符、连接符、结果去重、范围查询、模糊查询

    运算符 符号 解释 + 加法 - 减法 * 乘法 / 除法,结果是浮点数 = 等于 > 大于 < 小于 <>或者!= 不等于 >= 大于或者等于 <= 小于或者等于 ...