JavaWeb会话管理

会话和会话状态

会话是一个客户端浏览器与WEB服务器之间连续发生的一系列请求和响应过程。

会话状态是指WEB服务器与浏览器在会话过程中的状态信息,借助会话状态,WEB服务器能够把属于同一会话中的一系列的请求过程关联起来。WEB服务器端程序要能从大量的请求消息中区分哪些请求消息属于同一个会话,即能识别出来同一个浏览器的访问请求,者需要浏览器对其发出的每个请求消息都进行标识;属于同一会话中的请求消息都附带同样的标识号,而属于不同会话的请求消息总是附带不同的标识号,这个标识号就称为会话ID(SessionID)。

HTTP协议是一种无状态的协议,WEB服务器本身不能识别出哪些请求时一种浏览器发出的,浏览器的每一次请求都是完全孤立的。所以Web服务器,必须能够采用一种机制来唯一地标识一个用户,同时记录该用户的状态。Web服务器通常通过两种方式完成会话跟踪:

  • Cookie

    Cookie机制在浏览器中直接保存会话信息。服务器响应客户端时,在响应头部里带有set-cookie字段将会话信息发送给浏览器,客户端在后面的请求都将在头部中添加cookie字段,将会话信息放入其中。

    Cookie的作用范围默认可以作用当前目录和当前目录的子目录,但不能作用与当前目录的上一级。可以手动制定Cookie的作用范围。

    Cookie分为会话Cookie(Session Cookie)和持久化Cookie(Persistent Cookie):会话Cookie只存在于浏览器的内存中,浏览器关闭后Cookie将不进行保存;持久化Cookie保存在硬盘上,在浏览器关闭后Cookie仍然存在,下次访问能继续使用。

  • Session

    Session机制基于Cookie实现,采用的是在服务器端保持HTTP状态信息的方案。服务器采用一种类似与散列表的结构来保存Session上的数据,并通过Cookie将散列表的哈希值交由客户端保存。客户端在会话过程中,只需保存和发送哈希值。

    Session机制:当程序需要为某个客户端的请求创建一个Session时,服务器首先检查这个客户端的Session标识(即SessionID),如果已经包含一个SessionID,则说明以前已经为此客户创建过Session,服务器就按照这个SessionIDSession检索出来(如果检索不到,就可能会创建一个,这种情况可能出现在服务端已经删除了该用户对应的Session对象,但用户可以人为的在URL后面加上一个JSESSIOIN的参数)。如果客户请求不包含SessionID则为此客户创建一个Session并且生产一个与此Session关联的SessionID,这个SessionID在本次响应中返回给客户端保存。若浏览器禁用了Cookie,浏览器可以通过URL重写的方式传递Session

    保存sessionid

    1. 使用cookie,在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器

      浏览器保存SessionID一般是采用会话Cookie的方式。但如果手动的写入一个JSESSIONIDCookie,将保存在持久化Cookie中。

    2. 使用URL重写,把SessionID放在URL路径后面。在整个交互过程中,需要重写每一次的URL。附加的方式有两种

      • 作为URL路径的附加信息
      • 作为查询字符串

JavaWeb中的Cookie

  1. 创建Cookie对象

    Cookie cookie = new Cookie("name","value");
  2. 获取Cookie的值和名称

    cookie.getName();
    cookie.getValue();
  3. 调用response的一个方法把Cookie传给客户端

    response.addCookie(cookie);
  4. 获取所有Cookie

    Cookie[] cookies = request.getCookies();
  5. 设置Cookie过期时间

    //以秒为单位。
    //若为0,则立即删除该cookie;
    //若为负数,表示不存储该cookie(会话Cookie)
    //若为正数,则表示该cookie的存储时间(持久化Cookie)
    cookie.setMaxAge(30); 
  6. 设置Cookie作用范围

    cookie.setPath(path);

JavaWeb中的Session

JSP中获取Session对象

JSP页面中有个内置的session对象,可以直接使用。若当前的JSP页面或Servlet是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性值不为false,则服务器就会为创建一个HttpSession对象。若当前JSP页面不是客户端访问的当前web应用的第一个资源,且其他页面已经创建过Session对象,则当前JSP页面的session为前面回话的HttpSession对象。

Servlet中获取Session对象

Servlet中可以通过调用request对象的getSession对象来获取Session对象。

// create为false:有与当前jsp对象关联的httpsession对象,则返回该对象;若没有和当前JSP对象关联的httpsession对象,则返回null
// create为true:一定返回一个HttpSession对象,若有与当前jsp对象关联的httpsession对象,则返回该对象;若没有,则创建一个httpsession对象,并返回该对象
request.getSession(boolean create); 

销毁Session对象

销毁Session对象可以通过三种方式:

  1. 调用Session对象的invalidate方法

    session.invalidate();
  2. 服务器卸载当前Web应用

  3. 超出Session过期时间(默认30分钟)

    通过session对象设置过期时间

    session.setMaxInactiveInterval(5);//单位为秒

    web.xml中设置过期时间

    tomcat下config/web.xml
    <!--在web.xml中设置过期时间-->
    <!--在web.xml中设置过期时间-->
    <session-config>
       <session-timeout>5</session-timeout>
    </session-config>
  4. 并不是关闭浏览器就销毁HttpSession对象。例如通过持久化Cookie或者URL重写

Session对象常用方法

方法 描述
getId() 获取SessionID
setAttribute() 设置属性
getAttribute() 获取属性
removeAttribute() 移除属性
getAllAttributeNames() 获取所有的属性名
getMaxInactiveInterval() 获取最长到期时间
setMaxInactiveInterval() 设置最长到期事件
invalidate() 使该Session对象失效
getCreationTime() 获取创建时间
getLastAccessedTime() 获取上次访问时间

URL重写

URL重写是一种补充的会话管理机制,当浏览器不支持Cookie时,可以将会话标识作为URL地址的一个特殊参数,从而继续实现会话管理。

HttpServletResponse接口中定义了两个用于完成URL重写的方法:

response.encodeURL("url");
response.encodeRedirectURL("url")

猜你喜欢

转载自blog.csdn.net/qimingweikun/article/details/80531548
今日推荐