JSP内置对象---session

Session对象

    Session对象是javax.servlet.http.HttpSession接口的实例,但是这个接口并不像HttpServletRequest或HttpServletResponse那样本身还存在着一个父接口,这个没有,只是一个纯粹的接口。因为Session是属于HTTP协议的范畴。

    实际上在开发中session对象最主要的用处就是完成用户的登录(login)、注销(logout)等常见功能的,每一个session对象都表示不同的访问用户,session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能应用在HTTP协议中。


    在整个的session中,本身最重要的部分就是属性的操作部分,可是对于属性的操作除了:setAttribute()、getAttribute()、removeAttribute()之外,还有另外一组废弃的操作。


Session id

    对于每一个用户而言,实际上都表示一个个不同的session,那么服务器是靠什么来区分这些服务的呢?实际上靠的就是session id,即:每一个通过浏览器连接到服务器上的用户都会由服务器自动的分配一个不会重复的编号。取得SESSION ID的程序如下:

【session_01.jsp的内容如下:】

<%@page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>session</title></head>

<body>

<%

    String id = session.getId();

%>

<h3>SESSION ID:<%=id%></h3>

<h3>SESSION ID 长度:<%=id.length()%></h3>

</body>

</html>

执行此段代码的结果如下:


    每一个连接到服务器上的session id是完全不同的,所以服务器就是依靠这些完成,但是需要注意的是,对于id的操作并不是成对的,因为在正常情况下如果存在了get方法应该存在set方法。

    之前讲解cookie时自动设置的那个cookie就是每一个用户的session id,所以session 在进行操作的时候使用到了cookie的处理机制。

    但是对于session的操作有一点也必须说明的是,如果现在服务器关闭了,则session id肯定需要重新分配。

    原本的session id 根本就不保留,服务器关闭之后session id就没了,如果现在用户要求即使服务器关闭了session也可以继续保留,那么就需要使用到了序列化的机制。

 

    所谓的对象序列化,指的是一个对象通过二进制保存或进行传输,而且对象所在的类必须实现java.io.Serializable接口,对于session本身也可以完成这种序列化的操作,但是它不是手工完成的,而是需要自动配置完成,这个配置需要在Tomcat的安装目录的conf/server.xml中完成。

    <Context path="/skewrain" docBase="D:\org">

        <Manager

            className="org.apache.catalina.session.PersistentManager">

            debug=0 saveOnRestart="true"

            maxActiveSession="-1" minIdleSwap="-1"

            maxIdleSwap="-1"

            maxIdleBackup="-1"

            <Store

                  className="org.apache.catalina.session.FileStore"

                  directory="d:\temp.txt"/>

        </Manager>

    </Context>

当需要服务器关闭之后,session继续可以使用时,就可以采用如上的方式完成。【此时还没实现】



登录及注销

Session在所有的开发中,用的最多的地方是登录验证及注销操作功能。

    在各个的系统中几乎都会包括用户登录验证及注销的功能,那么此功能就完全可以使用session实现,具体的思路是:当用户登录成功之后,设置一个session范围的属性,之后在其他需要验证的页面中判断是否存在此session范围的属性,如果存在,则表示已经是正常登录过的合法用户,如果不存在,则给出提示,并跳转回登录页提示用户重新登录,用户登录之后可以进行注销的操作。


【login.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>session</title></head>

<body>

<form action="login.jsp" method="post">

    用户名:<input type="text" name="uname"><br>

    密  码:<input type="password" name="upass"><br>

            <input type="submit" value="登录">

            <input type="reset" value="重置">

</form>

<%//直接通过一个固定的用户名和密码

    String name = request.getParameter("uname");

    String password = request.getParameter("upass");

    if(!(name==null || "".equals(name) || password==null ||"".equals(password))){

         if("skewrain".equals(name) && "skewrain".equals(password)){

              //如果登录成功,则设置session属性范围!

               session.setAttribute("userid",name);

               response.setHeader("refresh","2;URL=welcome.jsp");

%>

         <h3>用户登录成功,两秒后跳转到欢迎页!</h3>

         <h3>如果没有跳转,请按<a href="welcome.jsp">这里</a>!</h3>

<%

        }else{

%>

         <h3>错误的用户名或密码!</h3>

<%

        }

}

%>

</body>

</html>

【welcome.jsp的内容如下:】

<%@page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>session</title></head>

<body>

<% //如果已经设置过了session属性,则肯定不为空

       if(session.getAttribute("userid")!=null){

%>

            <h3>欢迎<%=session.getAttribute("userid")%>光临本系统!<a href="logout.jsp">注销</a></h3>

<%

       }else{ //没有session,则应该给出提示。

%>

            <h3>请先进行系统的<a href="login.jsp">登录</a>!</h3>

<%

        }

%>

</body>

</html>

【logout.jsp的内容如下:】

<%@page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>session</title></head>

<body>

<%

    response.setHeader("refresh","2;URL=login.jsp");

    session.invalidate();  //注销,表示当前的session失效。

%>

    <h3>您已成功退出本系统,两秒后跳转回首页!</h3>

    <h3>如果没有跳转,请按<a href="login.jsp">这里</a>!</h3>

</body>

</html>

执行login.jsp的结果如下所示:


输入用户名:“skewrain”,密码:“skewrain”点击“登录”的结果如下:


两秒后,页面跳转至如下界面:


我们点击“注销”之后的结果如下图所示:


 

我们复制链接:

http://localhost:8888/skewrain/sessiondemo/welcome.jsp


重新打开一个浏览器,粘贴以上的地址的结果如下:


这都是Validate()函数的作用,使本次的session失效。


以上的这种做法属于session使用最多的一种登录验证的操作。

会话跟踪还有以下的四种技术:

1):通过session提供的方法保存;

2):通过Cookie;

3):通过表单的隐藏域完成;

4):通过地址重写。


在使用Struts时,可以发现很多的时候都是通过地址重写的方式进行的。


判断新用户

在session的对象中,可以使用isNew()方法判断一个用户是否是第一次访问页面。

 

判断一个用户是否是新用户的代码如下:【is_new.jsp】

<%@page contentType="text/html" pageEncoding="GBK"%>

<html>

<head><title>session</title></head>

<body>

<%

    if(session.isNew()){

%>

        <h3>欢迎新用户光临!</h3>

<% 

    }else{

%>

        <h3>您已经是老用户了!</h3>

<%

    }

%>

</body>

</html>

新打开一个浏览器,执行此程序的结果如下:


刷新此页面后的结果如下:



取得用户操作时间

如果要想取得一个session的具体的操作时间,可以通过计算方法求出。

Long start = session.getCreationTime();

Long end = session.getLastAccessedTime();   //以毫秒为单位

Long time = (end - start) / 1000;  //取得整数秒


小结:

1.Session对象最主要的功能就是用于登录验证操作。

2.当用户第一次连接到服务器上时会自动分配一个新的session id。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值