JSP九大内置对象之session对象

实际开发中session对象最主要的作用就是保存用户登录信息等,该信息系在用户退出(可以是关闭浏览器等)之前一直有效,用户退出后信息将自动移除;每一个session都代表不同的用户,即不同的用户有不同的session;

什么是session?

实际开发中session对象最主要的作用就是保存用户登录信息等,该信息系在用户退出(可以是关闭浏览器等)之前一直有效,用户退出后信息将自动移除;每一个session都代表不同的用户,即不同的用户有不同的session;

session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能在Http协议中使用;它的常用方法如下:

// 取得session id
public String getId()

// 取得session的创建时间
public long getCreationTime()

// 取得session的最后一次操作时间
public long getLastAccessedTime()

// 判断是否是新的session(新用户)
public boolean isNew()

// 让session失效
public void invalidate()

// 得到全部属性的名称
public Enumeration getAttributeNames()

// 设置Key/value值到session
public void setAttribute(String name, Object value);

// 从session中获取指定key的值
public Object getAttribute(String name);

// 从session中移除指定key的值
public void removeAttribute(String name)

获取SESSION ID

当一个用户连接到服务器后,服务器会自动为此session分配一个不会重复的session Id,服务器依靠这些不同的session Id来区分每一个不同的用户,可以使用HttpSession接口中的getId()方法取得这些编号!

<%
    String id = session.getId();
%>
Session ID:<%=id %><br/>
session ID Length:<%=id.length() %><br/>

输出结果:

Session ID:6111EC4ECDF44D9BBB81EBD20CB73821

session ID Length:32

这里的sessionId和cookie的JSESSIONID用处是一样的,为了区分,在使用session操作时实际上都使用了Cookie的处理机制,即在客户端的Cookie中保存每一个session Id,这样用户在每次发出请求时都会将此Session id发送到服务器端,服务器依靠此Session id区分每一个不同的客户端;

在使用session时,要注意:对于每一个已连接到服务器上的用户,如果重新启动服务器,则这些用户再次发出请求实

际上表示的都是一个新连接的用户,服务器会为每个用户重新分配一个新的session Id。

SESSION的使用

session是否可以在服务器重启后继续使用?在应用中,如果服务器重新启动,则已经分配的session Id就会消失,那么如何才能让这些session继续保存,等待服务器重新启动后继续使用呢?可以通过序列化的方式保存session继续使用,在tomcat服务器里可以通过配置server.xml文件,将每一个用户的session在服务器关闭时序列化到存储介质中(数据库、文件)这样即使服务器重新启动,也可以通过反序列化的方式,从指定的存储介质上反序裂化session;

配置server.xml:

<Context path="/test" docBase="/home/usr/test/temp">
   <Manager className="org.apache.catalina.PersistentManager">
        debug=0
        saveOnRestart="true"
        maxActiveSession="-1"
        minldleSwap="-1"
        maxldleSwap="-1"
        maxldleBackup="-1"
        <Store directory="/home/usr/test/temp"
            className="org.apache.catalina.session.FileStore"
    </Manager>
</Context>

说明:

<Manager>元素是专门来配置session管理操作的,该元素中每个属性对应的值:

  • className属性  session的管理器操作类,Tomcat通过此接口完成序列化管理

  • debug属性  session管理器的跟踪级别

  • saveOnRestart属性  配置服务重新启动前对session的处理,可以配置true或者false两种选择,为true则会在容器关闭前将有效的session保存,重新启动后重新载入。

  • maxActiveSession属性  可以活动的session的最大数,如果设置为-1,则表示不受限制,超过最大限制会将session对象转移到Session store中。

  • minIdleSwap属性  一个session不活动的最短时间,单位为秒;如果为-1则表示不受限制,超过该时间会将session对象转移到Session store中。该session不再内存中保存;

  • maxIdleBackup属性  session的最长时间,单位为秒,如果为-1,则表示不受限制,超过该时间会将session备份到session store中,但该session对象依然存在内存中;

<store>元素定义实现持久化session的操作类及指定的文件存方位置。

如果你配置了server.xml文件,即使服务器运行期间意外关闭了,用户的session也可以通过此配置进行反序列化保存到磁盘、数据库、文件等,然后重启tomcat,tomcat会将这些文件重新加载,恢复用户的session;

SESSION实例(登录及注销)

login.jsp(登录页面):

<body>
<form action="login.jsp" method="post">  
    用户名:<input type="text" name="uname"><br/>
    密 码:<input type="text" name="upwd"><br/>
    <input type="submit" value="登 录" />
    <input type="reset" value="重 置" />
</form>
<%
    String name = request.getParameter("uname");
    String upwd = request.getParameter("upwd");
    if ( name != null || !"".equals(name.trim()) ||
            upwd != null || !"".equals(upwd.trim()) ) {
        // 将用户名设置到session中
        session.setAttribute("username", name);
        // 定时跳转
        response.setHeader("refresh","2;URL=weclome.jsp");
%>
    <h2>如果没有跳转,<a href="weclome.jsp">请点击这里</a></h2>
<%
    } else {
%>
        输入信息不合法
<%
    }
%>
</body>

weclome.jsp(欢迎页面):

<body>
<%  
    if ( session.getAttribute("userid") != null) {  
%>  
    <h2>欢迎<%=session.getAttribute("username") %>登录系统</h2>
    <a href="logout.jsp">注销</a><br>  
<%  
    }else{
%>  
    <%=session.getAttribute("userid") %>
    请先进行合法登录!<a href="index.jsp">登录</a>
<%
    }
%>
</body>

判断新用户:

<%  
    if( session.isNew() ) {  
%>
        <h2>欢迎新用户!!!</h2>  
<%
    }else {
%>  
        <h2>您已经是老用户了!!!</h2>  
<%
    }
%>

第一次访问的话,会显示欢迎新用户,如果再次刷新一次,则显示老用户!isNew()是通过Cookie方式进行判断的(在之前的操作中,第一次通过request取得全部Cookie时是不会出现JESSINOID的,而第二次却会出现这个系统内建的JSESSIONID,这是由于Cookie是在第一次访问时由服务器端设置客户端的,所有服务器可以依靠是否存在JSESSIONID来判断此用户是否为新用户)。

我们愈是学习,愈觉得自己的贫乏。 —— 雪莱
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号