11 Session

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重写或隐藏域)

  1. session 在服务器端,cookie 在客户端(浏览器)
  2. session 默认被存在在服务器的一个文件里(不是内存)
  3. session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
  4. session 可以放在 文件、数据库、或内存中都可以。
  5. 用户验证这种场合一般会用 session
  6. 维持一个会话的核心就是客户端的唯一标识,即 session id

4. Session的过程

服务器使用一种类似于散列表的结构来保存信息。会话过程如下:

  1. 从浏览器发送一个请求,看这个请求没有带sessionId标识
  2. 如果没有sessionId,则在服务器新建一个session对象
  3. 服务器返回响应的时候,以cookie的方式,将sessionId返回给浏览器,在Tomcat中我们管sessionId标识符成为JSESSIONID
  4. 如果在浏览器中发送的请求,带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 对象:
  1. 直接调用 HttpSession 的 invalidate() 方法: 该方法使 HttpSession 失效

  2. 服务器卸载了当前 WEB 应用.

  3. 超出 HttpSession 的过期时间。设置 HttpSession 的过期时间,单位为秒:

session.setMaxInactiveInterval(5);

在 web.xml 文件中设置 HttpSession 的过期时间: 单位为 分钟:

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
  1. 并不是关闭了浏览器就销毁了 HttpSession.

2. HttpSession的方法

  • session.setAttribute(String name, Object value)方法:该方法将对象作为属性存储到会话对象中。

  • session.getAttribute(String name)方法:从会话对象中获取属性。如果属性不存在则返回null

  • removeAttribute(String name):该方法从会话对象中删除属性,如果不存在不会执行,也不会抛处错误。

  • invalidate():使会话失效,同时删除属性对象。

  • getId():返回会话期间的识别号

  • isNew():用于检测当前客户是否为新的会话。如果客户端请求消息中返回了一个与Servlet程序当前获得的HttpSession对象的会话标识号相同的会话标识号,则认为这个HttpSession对象不是新建的。

  • getCreationTime(): 返回会话创建时间

  • getLastAccessedTime():返回在会话时间内web容器接收到客户最后发出的请求的时间

  • getMaxInactiveInterval():返回在会话期间内客户请求的最长时间.秒

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值