运维开发网

在实战中使用Http监听器

运维开发网 https://www.qedev.com 2022-06-30 21:46 出处:网络
这篇文章主要介绍了使用HttpSessionListener监听器实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 HttpSessionListener监听器定义监听器packagelee;importjavax.servlet.*;

这篇文章主要介绍了使用HttpSessionListener监听器实战,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 HttpSessionListener监听器定义监听器packagelee;importjavax.servlet.*;importjavax.servlet.annotation.*;importjavax.servlet.http.*;importjava.util.*;@WebListenerpublicclassOnlineListenerimplementsHttpSessionListener{//当用户与服务器之间开始session时触发该方法publicvoidsessionCreated(HttpSessionEventse){HttpSessionsession=se.getSession();ServletContextapplication=session.getServletContext();//获取sessionIDStringsessionId=session.getId();//如果是一次新的会话if(session.isNew()){Stringuser=(String)session.getAttribute(quot;userquot;);//未登录用户当游客处理user=(user==null)quot;游客quot;:user;Maplt;String,Stringgt;online=(Maplt;String,Stringgt;)application.getAttribute(quot;onlinequot;);if(online==null){online=newHashtablelt;String,Stringgt;();}//将用户在线信息放入Map中online.put(sessionId,user);application.setAttribute(quot;onlinequot;,online);}}//当用户与服务器之间session断开时触发该方法publicvoidsessionDestroyed(HttpSessionEventse){HttpSessionsession=se.getSession();ServletContextapplication=session.getServletContext();StringsessionId=session.getId();Maplt;String,Stringgt;online=(Maplt;String,Stringgt;)application.getAttribute(quot;onlinequot;);if(online!=null){//删除该用户的在线信息online.remove(sessionId);}application.setAttribute(quot;onlinequot;,online);}}测试JSPlt;%@pagecontentType=quot;text/html;charset=GBKquot;language=quot;javaquot;errorPage=quot;quot;%gt;lt;%@pageimport=quot;java.util.*quot;%gt;lt;!DOCTYPEhtmlPUBLICquot;-//W3C//DTDXHTML1.0Transitional//ENquot;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdquot;gt;lt;htmlxmlns=quot;http://www.w3.org/1999/xhtmlquot;gt;lt;headgt;lt;titlegt;用户在线信息lt;/titlegt;lt;metaname=quot;websitequot;content=quot;http://www.crazyit.orgquot;/gt;lt;/headgt;lt;bodygt;在线用户:lt;tablewidth=quot;400quot;border=quot;1quot;gt;lt;%Maplt;String,Stringgt;online=(Maplt;String,Stringgt;)application.getAttribute(quot;onlinequot;);for(StringsessionId:online.keySet()){%gt;lt;trgt;lt;tdgt;lt;%=sessionId%gt;lt;tdgt;lt;%=online.get(sessionId)%gt;lt;/trgt;lt;%}%gt;lt;/bodygt;lt;/htmlgt;测试结果


HttpSessionListener监听器应用场景


应用场景:用于统计当前在线人数。

实现HttpSessionListenerimportjavax.servlet.ServletContext;importjavax.servlet.http.HttpSession;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;publicclassMyHttpSessionListenerimplementsHttpSessionListener{@OverridepublicvoidsessionCreated(HttpSessionEventhttpSessionEvent){System.out.println(quot;httpsession被创建quot;);}@OverridepublicvoidsessionDestroyed(HttpSessionEventhttpSessionEvent){System.out.println(quot;httpsession被销毁quot;);}}登陆界面去创建HttpSessionListenterlt;%@pagecontentType=quot;text/html;charset=UTF-8quot;language=quot;javaquot;%gt;lt;htmlgt;lt;headgt;lt;titlegt;$Title$lt;/titlegt;lt;/headgt;lt;bodygt;lt;%lt;%--创建HttpSessionListenter--%gt;request.getSession();%gt;lt;/bodygt;lt;/htmlgt;登出销毁HttpSessionListenterlt;%@pagecontentType=quot;text/html;charset=UTF-8quot;language=quot;javaquot;%gt;lt;htmlgt;lt;headgt;lt;titlegt;$Title$lt;/titlegt;lt;/headgt;lt;bodygt;lt;%lt;%--销毁HttpSessionListener--%gt;request.getSession().invalidate();%gt;lt;h1gt;已退出lt;/h1gt;lt;/bodygt;lt;/htmlgt;实现统计登陆人数(多线程并发)

在web.xml中配置监听

lt;xmlversion=quot;1.0quot;encoding=quot;UTF-8quot;gt;lt;web-appxmlns=quot;http://xmlns.jcp.org/xml/ns/javaeequot;xmlns:xsi=quot;http://www.w3.org/2001/XMLSchema-instancequot;xsi:schemaLocation=quot;http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdquot;version=quot;4.0quot;gt;lt;listenergt;lt;listener-classgt;MyHttpSessionListenerlt;/listener-classgt;lt;/listenergt;lt;listenergt;lt;listener-classgt;myServletContextListenerlt;/listener-classgt;lt;/listenergt;lt;/web-appgt;统计人数实在最大ServletContextListener这个域当中

因为HttpSessionListener侦听器只在当前会话中有效

(1)创建一个ServletContextListener并将初始值设置为0

importjavax.servlet.ServletContext;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;publicclassmyServletContextListenerimplementsServletContextListener{@OverridepublicvoidcontextInitialized(ServletContextEventservletContextEvent){ServletContextsc=servletContextEvent.getServletContext();sc.setAttribute(quot;countquot;,0);}@OverridepublicvoidcontextDestroyed(ServletContextEventservletContextEvent){}}

2)改变在线人数

importjavax.servlet.ServletContext;importjavax.servlet.http.HttpSession;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;publicclassMyHttpSessionListenerimplementsHttpSessionListener{@OverridepublicvoidsessionCreated(HttpSessionEventhttpSessionEvent){System.out.println(quot;httpsession被创建quot;);countPersion(httpSessionEvent.getSession().getServletContext(),true);}@OverridepublicvoidsessionDestroyed(HttpSessionEventhttpSessionEvent){System.out.println(quot;httpsession被销毁quot;);countPersion(httpSessionEvent.getSession().getServletContext(),false);}/**变更在线的人数**/publicvoidcountPersion(ServletContextsc,booleanisAdd){//为了防止多线程并发问题加锁synchronized(sc){//获得当前的在线人数Integercount=(Integer)sc.getAttribute(quot;countquot;);if(isAdd){sc.setAttribute(quot;countquot;,++count);}else{sc.setAttribute(quot;countquot;,--count);}}}}

(3)转到首页获取显示。

lt;%@pagecontentType=quot;text/html;charset=UTF-8quot;language=quot;javaquot;%gt;lt;htmlgt;lt;headgt;lt;titlegt;$Title$lt;/titlegt;lt;/headgt;lt;bodygt;lt;%lt;%--创建HttpSessionListenter--%gt;request.getSession();%gt;lt;h1gt;欢迎登陆lt;/h1gt;lt;hrgt;当前的在线人数${count}lt;ahref=quot;logout.jspquot;rel=quot;externalnofollowquot;gt;退出lt;/agt;lt;/bodygt;lt;/htmlgt;

以上个人经验,希望能给你一个参考

0

精彩评论

暂无评论...
验证码 换一张
取 消