Session
标签(空格分隔): JavaWeb
一、Session简介
1. Session是什么
session,指一类用来在客户端与服务器端之间保持状态的解决方案。session机制采用的是在服务器端保持 HTTP 状态信息的方案 。
1. Session有什么用
由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session。
典型的场景比如购物车,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。Session是保存在服务端的,有一个唯一标识。维持一个会话的核心就是客户端的唯一标识,即 session id
2. Session与Cookie的联系
在学习Cookie的时候,学到了Cookie机制采用的是在客户端保持 HTTP 状态信息的方案。 当浏览器访问WEB服务器的某个资源时,由WEB服务器在HTTP响应消息头中附带传送给浏览器的一个小文本文件。
那么Session也是保持Http状态的一种方案,二者有什么联系呢?
思考一下服务端如何识别特定的客户?
这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。
实际上大多数的应用都是用Cookie来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个SessionID,以后每次请求把这个SessionID发送到服务器,服务器就知道客户端是谁了。
3. Session和Cookie的区别
cookie 是一个实际存在的东西,http 协议中定义在 header 中的字段。
而我们所说的session,是一个抽象的概念。我们将客户端与服务端进行交互,将其抽象为一个“会话”,衍生出“会话状态”。
session是一种借助cookie本身和后端存储来实现的一种更高级的会话状态实现。(也有可能不借助cookie,而使用url重写或隐藏域)
- session 在服务器端,cookie 在客户端(浏览器)
- session 默认被存在在服务器的一个文件里(不是内存)
- session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
- session 可以放在 文件、数据库、或内存中都可以。
- 用户验证这种场合一般会用 session
- 维持一个会话的核心就是客户端的唯一标识,即 session id
4. Session的过程
服务器使用一种类似于散列表的结构来保存信息。会话过程如下:
- 从浏览器发送一个请求,看这个请求没有带sessionId标识
- 如果没有sessionId,则在服务器新建一个session对象
- 服务器返回响应的时候,以cookie的方式,将sessionId返回给浏览器,在Tomcat中我们管sessionId标识符成为JSESSIONID
- 如果在浏览器中发送的请求,带JSESSIONID号,那么通过这个好找到session对象
二、HttpSession接口
HttpSession接口是Java平台对session机制的实现规范。当需要为用户端建立一个session时,servlet容器就创建了一个HttpSession对象。其中存储了和本session相关的信息。所以,在一个servlet中有多少个不同用户连接,就会有多少个HttpSession对象。
1. HttpSession的生命周期
1.1 什么时候创建 HttpSession 对象
对于 JSP 来讲:
是否浏览器访问服务端的任何一个JSP页面,服务器都会立即创建一个 HttpSession对象呢?
答案是不一定。
若当前的JSP页面是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性值为false,则服务器就不会为该JSP创建一个HttpSession对象;
若当前JSP不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession对象,则服务器也不会为当前 JSP 页面创建一个 HttpSession 对象,而是会把与当前会话关联的那个HttpSession对象返回给当前的JSP页面。
对于 Serlvet来讲:
若 Serlvet 是客户端访问的第一个 WEB 应用的资源,则只有调用了 HttpSession session = request.getSession()
或 HttpSession session = request.getSession(true)
才会创建 HttpSession 对象
1.2 page指令的session=”false”表示什么意思?
当前 JSP 页面禁用 session 隐含变量,但可以使用其他的显式的 HttpSession 对象
1.3 在 Serlvet 中如何获取 HttpSession 对象?
HttpSession session = request.getSession(boolean create)`
返回当前reqeust中的HttpSession。
create为false表示:获取当前session,如果session不存在,则返回null。
create为true表示:返回一个session对象,若没有,则服务器创建一个新的。
HttpSession session = request.getSession()
等同于 request.getSession(true)
1.4 什么时候销毁 HttpSession 对象:
直接调用 HttpSession 的 invalidate() 方法: 该方法使 HttpSession 失效
服务器卸载了当前 WEB 应用.
超出 HttpSession 的过期时间。设置 HttpSession 的过期时间,单位为秒:
session.setMaxInactiveInterval(5);
在 web.xml 文件中设置 HttpSession 的过期时间: 单位为 分钟:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
- 并不是关闭了浏览器就销毁了 HttpSession.
2. HttpSession的方法
session.setAttribute(String name, Object value)
方法:该方法将对象作为属性存储到会话对象中。session.getAttribute(String name)
方法:从会话对象中获取属性。如果属性不存在则返回nullremoveAttribute(String name)
:该方法从会话对象中删除属性,如果不存在不会执行,也不会抛处错误。invalidate()
:使会话失效,同时删除属性对象。getId()
:返回会话期间的识别号isNew()
:用于检测当前客户是否为新的会话。如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。getCreationTime()
: 返回会话创建时间getLastAccessedTime()
:返回在会话时间内web容器接收到客户最后发出的请求的时间getMaxInactiveInterval()
:返回在会话期间内客户请求的最长时间.秒