首页 理论教育Web网站实训:通过session监听实现在线用户控制

Web网站实训:通过session监听实现在线用户控制

【摘要】:解决的办法是对session对象进行监听。session对象是有时效的。若一个客户二次请求JSP页面之间的间隔时长超过时效,则该客户的session对象自动销毁失效。session时效也可以在web.xml文件中配置。3)“login.jsp”程序接收用户名输入并提交给“checkLogin.jsp”判定该用户是否已登录。使用“记事本”输入“destroySession.jsp”程序并存放在应用目录“webapps/ROOT/E43”目录中

在基于JSP的管理信息系统开发中常需要限制已经登录在线的用户不能再登录。一个简单的设计是将登录的用户信息保存在全局对象application中。用户请求登录验证时与appli-cation中的登录用户比对,若不存在,允许该用户登录并将该用户信息保存在application中,若存在则不允许登录。用户退出时再请求一个页面删除该用户信息。正常情况下没有问题,问题往往出在非正常情况下,如死机了,断电重启。用户没有正常退出,就不能向服务器端发删除请求,该用户的信息被永远保存在application中,用户也永远不能再登录了,因为每次登录都首先要去application中进行检索。解决的办法是对session对象进行监听。

JSP技术中,采用session会话跟踪的方式保存一个客户在一个网站的活动记录。如果有10个客户访问一个网站,该网站就会自动生成10个不同的会话(session)对象来保存客户的活动信息。

当客户第一次请求一个JSP页面时,JSP容器(Resin)就会自动为该客户创建一个ses-sion对象。

session对象是有时效的。所谓时效是指一时间的长度。若一个客户二次请求JSP页面之间的间隔时长超过时效,则该客户的session对象自动销毁失效。session对象封装了使ses-sion失效的方法invalidate()、设置session时效的方法setMaxInactiveInterval(int interval)等。session时效也可以在web.xml文件中配置。

javax.servlet.http包中还定义了一个接口:HttpSessionListener。该接口中封装了两个方法:

void sessionCreated(HttpSessionEvent se);//响应session对象的创建

void sessionDestroyed(HttpSessionEvent se);//响应session对象的销毁失效

下面的一组程序(SessionCounter.java、login.jsp、checkLogin.jsp、destroySession.jsp)演示了使用session监听接口控制在线用户再次登录。各程序的源码及功能说明如下:

1)“SessionCounter.java”,这是session监听程序,因为类SessionCounter实现了接口Ht-tpSessionListener。该程序中使用向量数组Vector V存储用户名。当产生session超时或产生被销毁事件时执行sessionDestroyed(HttpSessionEvent event)方法:取出与session绑定的用户名并从向量V中删除。Estimate(String newUser)方法的功能是与Vector V中存储的用户名比较,判断用户newUser是否存在。

使用“记事本”输入SessionCounter.java并存储在webapps\ROOT\WEB-INF\classes\test目录下。

SessionCounter.java:

978-7-111-38219-5-Chapter04-42.jpg

978-7-111-38219-5-Chapter04-43.jpg

2)配置session失效时长和session监听程序SessionCounter.java。用记事本打开webapps\ROOT\WEB-INF\web.xml文件(若不存在,创建一个),文件的内容如下:

978-7-111-38219-5-Chapter04-44.jpg

978-7-111-38219-5-Chapter04-45.jpg

其中“<session-timeout>5</session-timeout>”定义了session的失效时长为5 min;“<listener-class>test.SessionCounter</listener-class>”指定了监听程序是“test”目录下的“SessionCounter.class”程序。Resin服务器启动后会自动编译“test”目录下“Session-Counter.java”,生成“SessionCounter.class”文件并装载它:监听session的创建和失效。一旦监听到有session失效则执行sessionDestroyed(HttpSessionEvent event)方法。

3)“login.jsp”程序接收用户名输入并提交给“checkLogin.jsp”判定该用户是否已登录。

使用“记事本”输入“login.jsp”程序并存放在应用目录“webapps/ROOT/E43”中。

login.jsp:(www.chuimin.cn)

978-7-111-38219-5-Chapter04-46.jpg

4)“checkLogin.jsp”程序获取“login.jsp”提交的用户名,调用session监听程序Ses-sionCounter的静态方法Estimate(String newUser)判定该用户是否已登录,若未登录则将用户名与session绑定,调用session监听程序SessionCounter的静态方法setUser(newUser)将newUser中的用户名保存到向量数组V中,然后进入系统,在系统的主页面显示“退出系统”按钮,若单击“退出系统”按钮关闭该页面即退出系统则请求执行destroySession.jsp使session立即失效而产生失效事件,session监听程序SessionCounter监听到失效事件而执行sessionDestroyed(HttpSessionEvent event)方法将该用户从向量数组V中删除,以便该用户能够再登录。若未单击“退出系统”按钮而退出了系统(如断电或单击浏览器窗口右上角的“×”),则只有失效时间到了session才能失效,在这之前,该用户不能再登录。若已登录在线则不能进入系统。

使用“记事本”输入“checkLogin.jsp”程序并存放在应用目录“webapps/ROOT/E43”目录中。

checkLogin.jsp:

978-7-111-38219-5-Chapter04-47.jpg

978-7-111-38219-5-Chapter04-48.jpg

5)“destroySession.jsp”退出系统时执行该程序,它立即使session失效:session.invalidate();。

使用“记事本”输入“destroySession.jsp”程序并存放在应用目录“webapps/ROOT/E43”目录中。

destroySession.jsp:

978-7-111-38219-5-Chapter04-49.jpg

978-7-111-38219-5-Chapter04-50.jpg

打开浏览器,在地址栏中输入http://192.168.2.1:8080/E43/login.jsp。在“login.jsp”页面输入一用户名“张建国”后单击“提交”按钮,正常进入系统,显示的界面如图4-11所示。

978-7-111-38219-5-Chapter04-51.jpg

图4-11 使用session监听接口控制在线用户再次登录

在另一计算机上打开浏览器,在地址栏中输入

978-7-111-38219-5-Chapter04-52.jpg

在“login.jsp”页面输入用户名“张建国”后单击“提交”按钮,不能进入系统,显示的界面如图4-12所示。

978-7-111-38219-5-Chapter04-53.jpg

图4-12 使用session监听接口控制在线用户再次登录