session的使用
0、代码链接
链接:https://pan.baidu.com/s/1A3_xYyKTHbbZ6yJ16XXEqg
提取码:uss5
1、实现效果
谷歌浏览器访问:
同时打开IE浏览器访问:
关闭IE浏览器等待一分钟后刷新谷歌浏览器:
2、实现过程
代码思路:
1) 实现session和request的监听器,监听session的创建和销毁以及请求的到来;(P.S:注册监听器——Servlet3.0 监听器直接使用注解@webListener即可,不用在web.xml中布局)
2)在request监听器中维护一个当前完网站访问用户数组,当新请求到达时,获得(没有时会自动创建)用户sessionID,根据用户sessionID判断该用户是否已经在;如果该用户不存在则存入用户数组并将用户数据存入servletContext域。
3)在session监听器中维护一个当前网站访问人数的变量,当有新的session创建时,统计变量++并存于servletContext域、当有session被销毁,统计变量减一,并在获得用户数组,将该用户从用户数组中删除
思考:这里为什么没有将sessionID存入cookie或者重写URL,因为有监听器,监听器自动监听session的创建和销毁,不需要自己判断当前请求的sessionID来自哪个用户,逻辑上也用不到这个数据,这里这是实现session创建和销毁,不需要实现用户关闭浏览器再次打开依然可以找到用户对应在服务器端的session
- web.xml配置session销毁时间
拓展:监听器
概述:
常用来监听servletContext、httpSession、servletRequest等域对象的创建、销毁以及属性的变化等等,能够在这些事件动作前后进行一定的逻辑处理。
ServletContext对象的作用域在整个WEB应用程序,类似于Static属性;Session的作用域在一个会话,一个会话可以理解为一个从一个浏览器发出请求到服务器开始,一直到浏览器关闭(但通常我们可以设置会话的生命期,防止那些获得连接后却长时间没有再向服务器发出请求的情况),相当于类的成员变量;request的作用域仅在一次请求,即浏览器发送一次请求到服务器处理该请求并发回响应就结束了,相当于局部变量。
生命周期:
第一、servletContext 生命周期,是从系统启动至系统结束。系统启动时创建该对象,整个过程中这个对象是唯一的。 总结为四个字:“自始至终”。
第二、httpSession 生命周期,在一个session会话中有效,在一个session被创建直到失效的过程中都存在且有效,一个启动的服务中httpSession 对象能够有多个,即多线程。 总结为四个字:“回话期间”
第三、servletRequest 生命周期,在一个request请求被创建和销毁的过程中有效,客户端每发起一次请求,即会创建一个新的servletRequest对象。 总结为资格字:“单次请求”。
HttpsessionListener接口
Session创建事件,发生在每次一个新的session创建的时候;Session失效事件,发生在每次一个Session失效的时候。
这个接口也只包含两个方法,分别对应于Session的创建和失效:
public void sessionCreated(HttpSessionEvent se);
public void sessionDestroyed(HttpSessionEvent se);
3、代码
package listener; import java.util.ArrayList; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import model.User; import util.SessionUtil; /** * Application Lifecycle Listener implementation class MyHttpSessionListener * */ @WebListener public class MyHttpSessionListener implements HttpSessionListener { private int userCount; /** * Default constructor. */ public MyHttpSessionListener() { // TODO Auto-generated constructor stub } /** * @see HttpSessionListener#sessionCreated(HttpSessionEvent) */ public void sessionCreated(HttpSessionEvent arg0) { // TODO Auto-generated method stub userCount++; arg0.getSession().getServletContext().setAttribute("userCount", userCount); } /** * @see HttpSessionListener#sessionDestroyed(HttpSessionEvent) */ public void sessionDestroyed(HttpSessionEvent arg0) { // TODO Auto-generated method stub userCount--; arg0.getSession().getServletContext().setAttribute("userCount", userCount); ArrayList<User> userList = (ArrayList<User>) arg0.getSession().getServletContext().getAttribute("userList"); String sessionID = arg0.getSession().getId(); if(SessionUtil.getSessionById(userList, sessionID) != null){ userList.remove(SessionUtil.getSessionById(userList, sessionID)); } arg0.getSession().getServletContext().setAttribute("userList", userList); } }
package listener; import java.util.ArrayList; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpServletRequest; import model.User; import util.SessionUtil; /** * Application Lifecycle Listener implementation class MyRequestListener * */ @WebListener public class MyRequestListener implements ServletRequestListener { private ArrayList<User> userList; /** * Default constructor. */ public MyRequestListener() { // TODO Auto-generated constructor stub } /** * @see ServletRequestListener#requestDestroyed(ServletRequestEvent) */ public void requestDestroyed(ServletRequestEvent arg0) { // TODO Auto-generated method stub } /** * @see ServletRequestListener#requestInitialized(ServletRequestEvent) */ public void requestInitialized(ServletRequestEvent arg0) { // TODO Auto-generated method stub userList = (ArrayList<User>) arg0.getServletContext().getAttribute("userList"); if(userList == null){ userList = new ArrayList<User>(); } HttpServletRequest httpServletRequest = (HttpServletRequest) arg0.getServletRequest(); //创建或获取session String sessionID = httpServletRequest.getSession().getId(); if(SessionUtil.getSessionById(userList, sessionID) == null){ User user = new User(); user.setSessionID(sessionID); userList.add(user); } arg0.getServletContext().setAttribute("userList", userList); } }
package model; public class User { private String sessionID; private String userName; private String userPass; public String getSessionID() { return sessionID; } public String getUserName() { return userName; } public String getUserPass() { return userPass; } public void setSessionID(String sessionID) { this.sessionID = sessionID; } public void setUserName(String userName) { this.userName = userName; } public void setUserPass(String userPass) { this.userPass = userPass; } }
package util; import java.util.ArrayList; import model.User; public class SessionUtil { public static User getSessionById(ArrayList<User> userList, String sessionID){ for(User user : userList){ if(user.getSessionID() == sessionID){ return user; } } return null; } }
<!DOCTYPE HTML> <html> <head> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>西南石油大学 - 计算机科学学院</title> <link rel="stylesheet" type="text/css" href="styles/base.css"></link> </head> <body> <div id="main"> <div id="top"> <div class="search"> <form> <input class="textInput" type="text" placeholder="请输入关键字"/> <div class="subDiv fr"> <input class="subInput" type="submit" value=""/> </div> </form> </div> </div> <nav id="nav"> <ul> <li> <a class="link" href="index.htm">网站首页</a> </li> <li class="mainmenu"> <a class="link" href="xygk/xyjj.htm">学院概况</a> <dl> <dd><a href="xygk/xyjj.htm">学院简介</a></dd> <dd><a href="xygk/xyld.htm">学院领导</a></dd> <dd><a href="xygk/zzjg.htm">组织机构</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="bksjy/jsjkxyjszy.htm">本科生教育</a> <dl> <dd><a href="bksjy/jsjkxyjszy.htm">计算机科学与技术专业</a></dd> <dd><a href="bksjy/rjgczy.htm">软件工程专业</a></dd> <dd><a href="bksjy/wlgczy.htm">网络工程专业</a></dd> <dd><a href="bksjy/wlwgczy.htm">物联网工程专业</a></dd> <dd><a href="bksjy/xxglyxxxtzy.htm">信息管理与信息系统专业</a></dd> <dd><a href="bksjy/wlkjaqzy.htm">网络空间安全专业</a></dd> <dd><a href="bksjy/sjkxydsjjszy.htm">数据科学与大数据技术专业</a></dd> <dd><a href="bksjy/dwrchzpyxm.htm">对外人才合作培养项目</a></dd> <dd><a href="bksjy/ksxx.htm">考试信息</a></dd> <dd><a href="bksjy/xkzxxx.htm">选课重修信息</a></dd> <dd><a href="bksjy/tzgg.htm">通知公告</a></dd> <dd><a href="bksjy/zlxz.htm">资料下载</a></dd> <dd><a href="bksjy/gxkjssp.htm">公选课教师视频</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="yjsjy/zsjz.htm">研究生教育</a> <dl> <dd><a href="yjsjy/zsjz.htm">招生简章</a></dd> <dd><a href="yjsjy/jsjkxyjsyjxk.htm">计算机科学与技术一级学科</a></dd> <dd><a href="yjsjy/rjgcyjxk.htm">软件工程一级学科</a></dd> <dd><a href="yjsjy/wlkjaqyjxk.htm">网络空间安全一级学科</a></dd> <dd><a href="yjsjy/yjsds.htm">研究生导师</a></dd> <dd><a href="yjsjy/yjsjztx.htm">研究生奖助体系</a></dd> <dd><a href="yjsjy/tzgg.htm">通知公告</a></dd> <dd><a href="yjsjy/zlxz.htm">资料下载</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="szdw/js.htm">师资队伍</a> <dl> <dd><a href="szdw/js.htm">教授</a></dd> <dd><a href="szdw/fjs.htm">副教授</a></dd> <dd><a href="szdw/js1.htm">讲师</a></dd> <dd><a href="szdw/syry.htm">实验人员</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="kxyj/kytd.htm">科学研究</a> <dl> <dd><a href="kxyj/kytd.htm">科研团队</a></dd> <dd><a href="kxyj/kypt.htm">科研平台</a></dd> <dd><a href="kxyj/kycg.htm">科研成果</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="xsgz/gzdt.htm">学生工作</a> <dl> <dd><a href="xsgz/gzdt.htm">工作动态</a></dd> <dd><a href="xsgz/tzgg.htm">通知公告</a></dd> <dd><a href="xsgz/kwcxsj.htm">课外创新实践</a></dd> <dd><a href="xsgz/bysjy.htm">毕业生就业</a></dd> <dd><a href="xsgz/xlzc.htm">心灵之窗</a></dd> <dd><a href="xsgz/qcfc.htm">青春风采</a></dd> <dd><a href="xsgz/zlxz.htm">资料下载</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="info/1189/4517.htm">招生工作</a> <dl> <dd><a href="zsgz/xyjs.htm">学院介绍</a></dd> <dd><a href="zsgz/bysjyqx.htm">毕业生就业去向</a></dd> <dd><a href="zsgz/yxbysjj.htm">优秀毕业生简介</a></dd> <dd><a href="zsgz/xshj.htm">学生获奖</a></dd> <dd><a href="zsgz/jyxyjs.htm">精英校友介绍</a></dd> <dd><a href="zsgz/zsgzxcbd.htm">招生工作宣传报道</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="info/1183/2625.htm">实验中心</a> <dl> <dd><a href="syzx/zxjj.htm">中心简介</a></dd> <dd><a href="syzx/syfs.htm">实验分室</a></dd> <dd><a href="syzx/gzzd.htm">规章制度</a></dd> <dd><a href="syzx/zlxz.htm">资料下载</a></dd> <dd><a href="http://syskf.swpu.edu.cn">开放预约</a></dd> </dl> </li> <li class="mainmenu"> <a class="link" href="djzc/djdt.htm">党建之窗</a> <dl> <dd><a href="djzc/djdt.htm">党建动态</a></dd> <dd><a href="djzc/xxyd.htm">学习园地</a></dd> <dd><a href="djzc/dwzwgk.htm">党务政务公开</a></dd> <dd><a href="djzc/zlxz.htm">资料下载</a></dd> </dl> </li> </ul> </nav> <div id="rollBar"> <div id="slideBox" class="slideBox"> <div id="slideBar" class="slideBar"> <ul> <li></li> <li></li> </ul> </div> <div id="bd" class="bd"> <ul> <li style="display: block;"><a href="images/welcome.jpg" target="_blank"><img src="images/welcome.jpg"></a></li> <li style="display: none;"><a href="images/main-zs.jpg" target="_blank"></a><img src="images/main-zs.jpg"></li> </ul> </div> <span id="prev" class="prev"> < </span> <span id="next" class="next"> > </span> </div> </div> <div id="container"> <!-- 1 --> <div class="container-box" columns="6"> <div class="inform-box fl" columns="4" style="width: 65%"> <div class="dynamic"> <h6>图片新闻</h6><span><a href="index/xwsd.htm"><img src="images/more.png"></a></span> </div> <div class="newBox"> <!--新闻信息--> <div class="new_pic"> <div style="OVERFLOW: hidden;height:174px;width:310px"> <div id="u_u4_div" style="text-align: center; padding:0px;margin:0px;border:0px solid black;background-color:#000000;height:174px;width:310px"> <div id="u_u4_imgdiv" style="padding:0px;border:0px; height: 100%; width: 100%"> <a id="u_u4_url" target="_blank" href="images/1.jpg"> <img style="width:100%; height:100%" src="images/1.jpg"/> </a> </div> </div> <div style="filter:alpha(style=1,opacity=10,finishOpacity=80);width:310px;height:19px;text-align:right;top:-30px;position:relative;padding:0px;margin:0px;border:0px;"> <a href="javascript:void(0);" id="selectNode1" class="imagechangenews_pnode" target="_self">1</a><a href="javascript:void(0);" id="selectNode2" class="imagechangenews_pnode" target="_self">2</a><a href="javascript:void(0);" id="selectNode3" class="imagechangenews_pnode" target="_self">3</a><a href="javascript:void(0);" id="selectNode4" class="imagechangenews_pnode" target="_self">4</a><a href="javascript:void(0);" id="selectNode5" class="imagechangenews_pnode" target="_self">5</a><a href="javascript:void(0);" id="selectNode6" class="imagechangenews_pnode" target="_self">6</a> </div> </div> <div style="text-align: center;overflow:hidden;text-overflow:ellipsis;height:25px;width:310px;"><a target="_blank" class="titlestyle192939" id="u_u4_newstitle" href="info/1045/4427.htm" title="计科院组织学生参加2018天府国际网络安全高峰论坛">计科院组织学生参加2018天府国际网络安全高峰论坛</a></div> </div> <div class="new_list"> <ul class="dynamic_list fr"> <li><a href="info/1045/4613.htm" title="计算机科学学院举办2019年寒假留校学生新春团拜会"><span>[02-01]</span><em>计算机科学学院举办2019年寒假留校学生新春</em></a></li> <li><a href="info/1045/4650.htm" title="学院召开教职工大会学习传达中层干部大会精神 部署学院学期工作"><span>[03-15]</span><em>学院召开教职工大会学习传达中层干部大会精</em></a></li> <li><a href="info/1045/4643.htm" title="计科院工会组织学院女教职工庆祝第109个“三八妇女节”"><span>[03-12]</span><em>计科院工会组织学院女教职工庆祝第109个“</em></a></li> <li><a href="info/1045/4633.htm" title="学术讲座——人工智能改变我们的未来生活"><span>[03-05]</span><em>学术讲座——人工智能改变我们的未来生活</em></a></li> <li><a href="info/1045/4603.htm" title="计算机科学学院各年级辅导员集中走访学生寝室"><span>[01-21]</span><em>计算机科学学院各年级辅导员集中走访学生寝</em></a></li> <li><a href="info/1045/4592.htm" title="学院召开2018年度领导班子民主生活会"><span>[01-14]</span><em>学院召开2018年度领导班子民主生活会</em></a></li> </ul> </div> </div> </div> <div class="inform-box fr" columns="2" style="width: 30%;"> <div class="dynamic cleafix"> <h6>学术交流</h6><span><a href="kxyj/kytd.htm"><img src="images/more.png"></a></span> </div> <div class="newBox"> <div class="new_list"> <ul> <li> <a href="info/1076/4624.htm" title="人工智能改变我们的未来生活"><em>人工智能改变我们的未来生活</em></a></li> <li> <a href="info/1076/4537.htm" title="计算时代的虚假信息传播"><em>计算时代的虚假信息传播</em></a></li> <li> <a href="info/1076/4483.htm" title="人工智能+:视界充满AI"><em>人工智能+:视界充满AI</em></a></li> <li> <a href="info/1076/4397.htm" title="零行列式策略及其网络演化动力学"><em>零行列式策略及其网络演化动力学</em></a></li> <li> <a href="info/1076/4388.htm" title="视频遇上云服务"><em>视频遇上云服务</em></a></li> <li> <a href="info/1076/4380.htm" title="计科院关于举行2018年校庆论文报告会的通知"><em>计科院关于举行2018年校庆论文报告会的通知</em></a></li> </ul> </div> </div> </div> <div style="clear: both"></div> </div> <!-- 2 --> <div class="container-box" columns="6"> <div class="inform-box fl" columns="4" style="width: 65%"> <div class="dynamic"> <h6>新闻速递</h6> <span><a href="index/xwsd.htm"><img src="images/more.png"></a></span> </div> <div class="newBox"> <div class="new_list hasDetail"> <h3><a href="info/1045/4613.htm">计算机科学学院举办2019年寒假留校学生新春团拜会</a></h3> <p>在中华民族传统节日——春节即将到来之际,为让学院留校学生感受家的温暖,向他们传达学院的慰问和祝福。2019年2月1日上午9时30分,计算机科学学院在明理楼B306会议室隆重举行2019年寒假留…[<span><a href="info/1045/4613.htm">详细信息</a></span>]</p> <ul> <li><a href="info/1045/4650.htm"><span>03/15</span><em>学院召开教职工大会学习传达中层干部大会精神 部署学院学期工作</em></a></li> <li><a href="info/1045/4643.htm"><span>03/12</span><em>计科院工会组织学院女教职工庆祝第109个“三八妇女节”</em></a></li> <li><a href="info/1045/4633.htm"><span>03/05</span><em>学术讲座——人工智能改变我们的未来生活</em></a></li> <li><a href="info/1045/4603.htm"><span>01/21</span><em>计算机科学学院各年级辅导员集中走访学生寝室</em></a></li> <li><a href="info/1045/4592.htm"><span>01/14</span><em>学院召开2018年度领导班子民主生活会</em></a></li> <li><a href="info/1045/4589.htm"><span>01/10</span><em>计科院与川庆安检院技术交流大会</em></a></li> </ul> </div> </div> </div> <div class="inform-box fr" columns="2" style="width: 30%"> <div class="dynamic"> <h6>党建动态</h6><span><a href="djzc/djdt.htm"><img src="images/more.png"></a></span> </div> <div class="newBox"> <div class="new_list"> <ul> <li> <a href="info/1082/4651.htm" title="学院召开教职工大会学习传达中层干部大会精神 部署学院学期工作"><em>学院召开教职工大会学习传达中层干部大会精神 部署学院学期工作</em></a></li> <li> <a href="info/1082/4593.htm" title="学院召开2018年领导班子民主生活会"><em>学院召开2018年领导班子民主生活会</em></a></li> <li> <a href="info/1082/4520.htm" title="刘翔同志任计算机科学学院党委副书记、纪委书记"><em>刘翔同志任计算机科学学院党委副书记、纪委书记</em></a></li> <li> <a href="info/1082/4512.htm" title="学院党委组织师生收看庆祝改革开放40周年大会"><em>学院党委组织师生收看庆祝改革开放40周年大会</em></a></li> <li> <a href="info/1082/4464.htm" title="【审核评估】学院召开本科教学工作审核评估办学定位与目标宣讲大会"><em>【审核评估】学院召开本科教学工作审核评估办学定位与目标宣讲大会</em></a></li> <li> <a href="info/1082/4424.htm" title="【聚焦评估】学院召开本科教学工作审核评估工作会"><em>【聚焦评估】学院召开本科教学工作审核评估工作会</em></a></li> <li> <a href="info/1082/4471.htm" title="学院党委开展迎校庆主题党日活动"><em>学院党委开展迎校庆主题党日活动</em></a></li> <li> <a href="info/1082/4376.htm" title="学院党委组织收看2018年全国科学道德和学风建设宣讲教育报告会"><em>学院党委组织收看2018年全国科学道德和学风建设宣讲教育报告会</em></a></li> </ul> </div> </div> </div> <div style="clear: both"></div> </div> <!-- 3 --> <div class="container-box" columns="6"> <div class="inform-box fl" columns="4" style="width: 65%"> <div class="dynamic cleafix"> <h6>通知公告</h6><span><a href="index/tzgg.htm"><img src="images/more.png"></a></span> </div> <div class="newBox"> <div class="new_list"> <ul> <li> <a href="info/1055/4638.htm"><em>自组团出访前公示信息表(彭博)</em></a></li> <li> <a href="info/1055/4627.htm"><em>计算机科学学院2019年春季学期开学教学准备及检查工作实施方案</em></a></li> <li> <a href="info/1055/4626.htm"><em>西南石油大学计算机科学学院关于举行学院2019年春季田径运动会的通知</em></a></li> <li> <a href="info/1055/4600.htm"><em>2018年秋季学期期末考试情况总结</em></a></li> <li> <a href="info/1055/4597.htm"><em>计算机科学学院2018年度教职工考核优秀名单公示</em></a></li> <li> <a href="info/1055/4588.htm"><em>国际学术会议(ICCIS2019)征稿通知</em></a></li> <li> <a href="info/1055/4584.htm"><em>计算机科学学院领导班子2018年度民主生活会征求意见</em></a></li> <li> <a href="info/1055/4578.htm"><em>关于表彰计算机科学学院2018-2019学年秋季学期“最美寝室”的通知</em></a></li> </ul> </div> </div> </div> <div class="inform-box fr" columns="2" style="width: 30%"> <div class="dynamic"> <h6>专题列表</h6> </div> <div class="newBox"> <div class="new_list"> <ul> <li> <a href="info/1173/2003.htm" title="中美联合高性能和大数据计算实验室"><em>中美联合高性能和大数据计算实验室</em></a></li> <li> <a href="info/1173/2004.htm" title="石油工程计算机模拟技术重点实验室"><em>石油工程计算机模拟技术重点实验室</em></a></li> <li> <a href="info/1173/2005.htm" title="思科网络技术学院教师培训中心"><em>思科网络技术学院教师培训中心</em></a></li> </ul> </div> </div> </div> <div style="clear: both"></div> </div> </div> </div> <footer id="footer"> <div>Copyright© 2018 All Rights Reserved. 西南石油大学计算机科学学院</div> <% int count = (int)pageContext.getAttribute("userCount",pageContext.APPLICATION_SCOPE); %> <div>当前在线人数:<%=count%></div> </footer> <script src="script/slider.js" type="text/javascript"></script> </body> </html>
4、相关资料
https://blog.csdn.net/zcw4237256/article/details/79140830 “当浏览器关闭时,Session就被销毁了?”