传智播客学习之Servlet监听器

来源:互联网 发布:python 面向对象 编辑:程序博客网 时间:2024/05/29 18:49

       今天可谓是异常艰辛的一天,因为昨晚只能休息三个小时的原因,早上上课的时候特别的困乏,但是又十分舍不得今天的课程内容,因为老师将要和我们和大家分享一他项目中的一段精华,里面涉及到得内容主要是Servlet监听器,冯老师永远是一个培养应用型人才的老师,听他讲课只有一种感觉,那就是不是为了讲课而在讲课,而是感觉他就是一个项目经理。废话不多说了,接下来和大家分享一段实用的小程序吧。

一、项目需求:统计网站在线人数

二、业务流程分析:通过了解需求,我们可以得到如下的流程:

.功能分析:

1.       后台界面显示游客ip功能

2.       后台管理页面显示登陆用户的ip

3.       过滤游客即不登陆不能进入chapter.jsp以及title.jsp

4.       后台管理页面可以将不合法的登陆用户变成游客

5.       将长期不在线的用户(session失效的用户)排除在记录数种

四、.设计

我们要想记录当前总在线人数,那么我们需要注册一个随服务器启动而创建,随服务器消亡而消亡的监听器,这里我们选用建立一个监听器类实现ServletContextListener监听器接口,从总体功能分析,我们需要有一个存放用户信息的容器,这里我们选用Map,并在服务器启动初始化。每一个用户登录都有用户名和密码,那么我们需要一个javabeanUser)来封装用户信息。

public void contextInitialized(ServletContextEvent sce) {

                            System.out.println("MyServletContextListener contextInitialized");

                            //获取上下文对象

                            ServletContext sc=sce.getServletContext(); 

                            //定义集合存放游客和登录用户Map<sessionid,sessionUser>

                            Map  onlineNum=new HashMap();

                            //集合放置到作用域中(范围最大的)

                            sc.setAttribute("onlineNum", onlineNum);

                     }

 

功能1:后台界面显示游客ip功能

我们要想在后台界面显示游客ip,只用判断用户名是否为空即可,我们需要在游客访问时,获取ip并将这个ip传递给后台界面,那么我们可以在index.jsp中通过request对象获取ip地址,然后放在一个作用域中(通过后面的设计,同时当用户利用用户名登录的时候,我们需要注册一个监听,获取其ip等信息,所以我们想到了感知Session绑定的事件的监听器(HttpSessionBindingListener),在使用此监听器时,我们需要让javabean实现这个接口,为了不破坏原有的javabean,我们选择使用一个新的类,继承javabean并实现HttpSessionBindingListener接口,我们将它封装到一个javabean中即SessionUser,并将这个对象放置到Session中),然后我们在后台界面上通过el表达式取出该ip

public void valueBound(HttpSessionBindingEvent event){

HttpSession session=event.getSession();//event中回去session对象

this.session=session;         //给全局变量的session 赋值

ServletContext sc=session.getServletContext(); //获取ServletContext,在整个web生命周期中只有一个

onlineNum=(Map)sc.getAttribute("onlineNum");//获取ServletContext中的onlineNum属性Map  onlineNum.put(session.getId(), this);}

 

功能2:后台管理页面显示登陆用户的ip

Index.jsp提交到login.jsp,登录后提交给loginservlet,在欢迎界面设置了session的属性,这个session保存着。当一个用户访问页面并没有登录,而是在登录界面等待,超过了session的有效时间,再次输入用户名登录时,之前在index中设置的session已经失效,所以会创建一个新session,那么我们可以不让其创建新的session,通过getsessionfalse),session为空,所以我们可以新建一个SessionUser放进去,或者转发到登录页面让其重新登录。

方式一session不存在,转到index.jspsession有效,转到title.jsp(转到chapt.er.jsp

方式二、当游客存在的时候,session有效,游客不存在,session过期,此时是一个新的session,里面的属性肯定为空,出现问题,所以处理方式就是新建一个SessionUser放到里面

处理方式

功能3:过滤游客即不登陆不能进入chapter.jsp以及title.jsp

过滤游客,如果没有登录,不准进入除了首页其他页,可以通过<c:set>设置一个值放到作用域中,通过requestlogin.jsp页面,在chapter.jsp中判断用户名是否为空

<c:if test="${sessionScope.userinfo.username==null}">

       <c:set value="请登录..." scope="request" var="errorinfo"></c:set>

       <jsp:forward page="/WEB-INF/jsp/login.jsp"></jsp:forward>

</c:if>

 

功能4:后台管理页面可以将不合法的登陆用户变成游客

通过后台inlineNum.jsp转到RemooveServlet, 处理完毕再转到inlineNum.jsp,如何找到该不合法用户呢?通过map中的sessionid找到sessionUser找到用户名。

如何获得sessionId呢?需要将session传过去,定义一个全局变量,然后用这个session到集合中去找,找到变为游客

 

功能5:将长期不在线的用户(session失效的用户)排除在记录数种

当用户长时间未与服务器通信,session过期,session对象在服务器的内存中消失,即不存在,我们需要清除内存中的SessionUser,不然统计在线人数就不对了。我们可以注册一个HttpSessionListen监听器,通过sessiondDestroyed销毁那些对象,获取session,获取sessionIdservletcontext获得map,通过id删除map中的SessionUser,并从session中删除userinfo