Java Web从入门到精通(第2版)
上QQ阅读APP看书,第一时间看更新

6.4 session对象

视频讲解:光盘\TM\lx\6\04 session对象.mp4

session在网络中被称为会话。由于HTTP协议是一种无状态协议,也就是当一个客户向服务器发出请求,服务器接收请求,并返回响应后,该连接就结束了,而服务器并不保存相关的信息。为了弥补这一缺点,HTTP协议提供了session。通过session可以在应用程序的Web页面间进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭浏览器。但是,如果在一个会话中,客户端长时间不向服务器发出请求,session对象就会自动消失。这个时间取决于服务器,例如,Tomcat服务器默认为30分钟。不过这个时间可以通过编写程序进行修改。

实际上,一次会话的过程也可以理解为一个打电话的过程。通话从拿起电话或手机拨号开始,一直到挂断电话结束,在这个过程中,可以与对方聊很多话题,甚至重复的话题。一个会话也是这样,可以重复访问相同的Web页。

6.4.1 创建及获取客户的会话

通过session对象可以存储或读取客户相关的信息,如用户名或购物信息等,这可以通过session对象的setAttribute()方法和getAttribute()方法实现。下面分别进行介绍。

1.setAttribute()方法

该方法用于将信息保存在session范围内,其语法格式如下:

        session.setAttribute(String name, Object obj)

参数说明:

name:用于指定作用域在session范围内的变量名。

obj:保存在session范围内的对象。

【例6.15】将用户名“绿草”保存到session范围内的username变量中,可以使用下面的代码:

        session.setAttribute("username", "绿草");

2.getAttribute()方法

该方法用于获取保存在session范围内的信息,其语法格式如下:

        getAtttibute(String name)

参数说明:

name:指定保存在session范围内的关键字。

【例6.16】读取保存在session范围内的username变量的值。代码如下:

        session.getAttribute("username");

说明

getAttribute()方法的返回值是Object类型,如果将获取到的信息赋值给String类型的变量,则需要进行强制类型转换或调用其toString()方法,例如,下面的两行代码都是正确的。

        String user=(String)session.getAttribute("username");        //强制类型转换
        String user1=session.getAttribute("username").toString();    //调用toString()方法

6.4.2 从会话中移动指定的绑定对象

对于存储在session会话中的对象,如果想将其从session会话中移除,可以使用session对象的removeAttribute()方法,该方法的语法格式如下:

        removeAttribute(String name)

参数说明:

name:用于指定作用域在session范围内的变量名。一定要保证该变量在session范围内有效,否则将抛出异常。

【例6.17】将保存在session会话中的username对象移除的代码如下:

        <%
        session.removeAttribute("username");
        %>

6.4.3 销毁session

虽然当客户端长时间不向服务器发送请求后,session对象会自动消失,但对于某些实时统计在线人数的网站(例如聊天室),每次都等session过期后,才能统计出准确的人数,这是远远不够的。所以还需要手动销毁session。通过session对象的invalidate()方法可以销毁session,其语法格式如下:

        session.invalidate();

session对象被销毁后,将不可以再使用该session对象了。如果在session被销毁后,再调用session对象的任何方法,都将报出Session already invalidated异常。

6.4.4 会话超时的管理

在应用session对象时应该注意session的生命周期。一般来说,session的生命周期在20~30分钟之间。当用户首次访问时将产生一个新的会话,以后服务器就可以记住这个会话状态,当会话生命周期超时时,或者服务器端强制使会话失效时,这个session就不能使用了。在开发程序时应该考虑到用户访问网站时可能发生的各种情况,例如用户登录网站后在session的有效期外进行相应操作,用户会看到一张错误页面,这样的现象是不允许发生的。为了避免这种情况的发生,在开发系统时应该对session的有效性进行判断。

在session对象中提供了设置会话生命周期的方法,分别介绍如下。

getLastAccessedTime():返回客户端最后一次与会话相关联的请求时间。

getMaxInactiveInterval():以秒为单位返回一个会话内两个请求最大时间间隔。

setMaxInactiveInterval():以秒为单位设置session的有效时间。

例如,通过setMaxInactiveInterval()方法设置session的有效期为10000秒,超出这个范围session将失效。

        session.setMaxInactiveInterval(10000);

6.4.5 session对象的应用

session是较常用的内置对象之一,与request对象相比其作用范围更大。下面通过实例介绍session对象的应用。

【例6.18】在index.jsp页面中,提供用户输入用户名文本框;在session.jsp页面中,将用户输入的用户名保存在session对象中,用户在该页面中可以添加最喜欢去的地方;在result.jsp页面中,显示用户输入的用户名与最想去的地方。(实例位置:光盘\TM\sl\6\7)

(1)index.jsp页面的代码如下:

        <form id="form1" name="form1" method="post" action="session.jsp">
         <div align="center">
          <table width="23%" border="0">
            <tr>
              <td width="36%"><div align="center">您的名字是:</div></td>
              <td width="64%">
              <label>
              <div align="center">
                <input type="text" name="name" />
              </div>
              </label>
              </td>
            </tr>
            <tr>
              <td colspan="2">
              <label>
                <div align="center">
                  <input type="submit" name="Submit" value="提交" />
                </div>
              </label>
              </td>
            </tr>
          </table>
         </div>
        </form>

index.jsp页面的运行结果如图6.8所示。

图6.8 index.jsp页面的运行结果

(2)在session.jsp页面中,将用户在index.jsp页面中输入的用户名保存在session对象中,并为用户提供用于添加最想去的地址的文本框。代码如下:

        <%
            String name=request.getParameter("name");           //获取用户填写的用户名
            session.setAttribute("name", name);                 //将用户名保存在session对象中
        %>
        <div align="center">
        <form id="form1" name="form1" method="post" action="result.jsp">
            <table width="28%" border="0">
              <tr>
              <td>您的名字是:</td>
              <td><%=name%></td>
              </tr>
              <tr>
              <td>您最喜欢去的地方是:</td>
              <td><label>
                <input type="text" name="address" />
              </label></td>
              </tr>
            <tr>
              <td colspan="2"><label>
                <div align="center">
                  <input type="submit" name="Submit" value="提交" />
                  </div>
              </label></td>
            </tr>
          </table>
      </form>

session.jsp页面的运行结果如图6.9所示。

图6.9 session.jsp页面的运行结果

(3)在result.jsp页面中,实现显示用户输入的用户名与最喜欢去的地方。代码如下:

      <%
          String name=(String)session.getAttribute("name");     //获取保存在session范围内的对象
          String solution=request.getParameter("address");      //获取用户输入的最喜欢去的地方
      %>
      <form id="form1" name="form1" method="post" action="">
        <table width="28%" border="0">
          <tr>
            <td colspan="2"><div align="center"><strong>显示答案</strong></div></td>
          </tr>
          <tr>
            <td width="49%"><div align="left">您的名字是:</div></td>
            <td width="51%"><label>
            <div align="left"><%=name%></div>                   //将用户输入的用户名在页面中显示
            </label></td>
          </tr>
          <tr>
            <td><label>
            <div align="left">您最喜欢去的地方是:</div>
            </label></td>
            <td><div align="left"><%=solution%></div></td>      //将用户输入的最喜欢去的地方在页面中显示
          </tr>
        </table>
      </form>

result.jsp页面的运行结果如图6.10所示。

图6.10 result.jsp页面的运行结果