JavaWeb中的Session、SessionListener、在线人数统计

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

JavaWeb中的Session
  • 在JavaWeb中使用HttpSession(以下简称session)对象来表示一个会话。
    正在装载数据……
  • Session的创建(代表会话周期的开始):第一次调用request.getSession()方法时,会创建一个session对象。
  • Session的销毁(代表会话周期的结束):在某个请求周期内调用了Session.invalidate()方法,此请求周期结束后,session被销毁;或者是session超时后自动销毁。
  • 对于JSP,如果指定了<%@ page session="false"%>,则在JSP中无法直接访问内置的session变量,同时也不会主动创建session,因为此时JSP未自动执行request.getSession()操作获取session。
  • 在session对象刚创建的第一个请求周期内,调用session.isNew()方法将得到true。
  • 可以在web.xml文件中配置session默认的超时时间(分钟):
    < session-config >
        
    < session-timeout > 10 session-timeout >
    session-config >
    也可以调用session. setMaxInactiveInterval()方法设置session超时时间(分钟)

SessionListener

  • 通过SessionListenr可以监听session的创建和销毁,步骤:
    1.写一个类MySessionListener,实现javax.servlet.http.HttpSessionListener接口及其sessionCreated()、sessionDestroyed()方法
    2.在web.xml中配置SessionListener:
    < listener >
        
    < listener-class > MySessionListener类全名 listener-class >
    listener >
  • 当 session被创建和销毁时,容器会分别调用SessionListener的sessionCreated()方法和 sessionDestroyed()方法,这两个方法中传入了一个参数对象HttpSessionEvent,可以通过此对象的 getSession()方法获取session对象。

应用:在线人数统计

import java.util.HashSet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MySessionListener implements HttpSessionListener {

       
public void sessionCreated(HttpSessionEvent event) {
               HttpSession session
= event.getSession();
               ServletContext application
= session.getServletContext();
              
              
// 在application范围由一个HashSet集保存所有的session
               HashSet sessions = (HashSet) application.getAttribute( " sessions " );
              
if (sessions == null ) {
                      sessions
= new HashSet();
                      application.setAttribute(
" sessions " , sessions);
               }
              
              
// 新创建的session均添加到HashSet集中
               sessions.add(session);
              
// 可以在别处从application范围中取出sessions集合
              // 然后使用sessions.size()获取当前活动的session数,即为“在线人数”
        }

       
public void sessionDestroyed(HttpSessionEvent event) {
               HttpSession session
= event.getSession();
               ServletContext application
= session.getServletContext();
               HashSet sessions
= (HashSet) application.getAttribute( " sessions " );
              
              
// 销毁的session均从HashSet集中移除
               sessions.remove(session);
        }
}

 

 

package stat;

import javax.servlet.http.HttpServlet;  
import javax.servlet.http.HttpSessionAttributeListener;  
import javax.servlet.http.HttpSessionBindingEvent;  
import javax.servlet.http.HttpSessionBindingListener;  
import javax.servlet.http.HttpSessionEvent;  
import javax.servlet.http.HttpSessionListener;  

public class OnlineCounter extends HttpServlet implements HttpSessionListener,  
    HttpSessionAttributeListener,HttpSessionBindingListener {  
public OnlineCounter(){  
    System.out.println("OnlineCounter initialized.");  
}  
private static final long serialVersionUID = 1L;  

private static int sessionCounter = 0;  

private static int attributeCounter = 0;  

public void sessionCreated(HttpSessionEvent se) {  
    sessionCounter++;  
    System.out.println("session created:" + sessionCounter);  
}  

public void sessionDestroyed(HttpSessionEvent se) {  
    sessionCounter--;  
    System.out.println("session destroied");  
}  

public void attributeAdded(HttpSessionBindingEvent se) {  
    attributeCounter++;  
    System.out.println("attribute added :" + attributeCounter);  
}  

public void attributeRemoved(HttpSessionBindingEvent se) {  
    attributeCounter--;  
    System.out.println("attribute removed");  
}  

public void attributeReplaced(HttpSessionBindingEvent se) {  
    System.out.println(se.getName()+" replaced");  
}  
    
public void valueBound(HttpSessionBindingEvent event){  
      System.out.println(event.getName()+"_Bound_"+event.getValue());  
}  

public void valueUnbound(HttpSessionBindingEvent event) {  
    System.out.println(event.getName()+"_Unbound_"+event.getValue());  
}  

public static int getOnlineSession() {  
    return sessionCounter;  
}  
public static int getOnlineAttribute() {  
    return attributeCounter;  
}  
}  

 

统计在线人数..sessionCreated中添加ip判断

package com.asiainfo.sale.common;

import javax.servlet.http.*;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.Date;
import java.util.ArrayList;
import java.sql.Timestamp;
import javax.servlet.ServletRequestListener;
import javax.servlet.ServletRequestEvent;

public class SessionCounter implements HttpSessionListener,ServletRequestListener {
    private static final String CONTENT_TYPE = "text/html; charset=GBK";
    private static int activeSessions = 0;
    private HttpServletRequest request;
    private static ArrayList list = new ArrayList();

    public void init() throws ServletException {

    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        HttpSession session = request.getSession();
    }

    public void destroy() {
    }

    public void requestDestroyed(ServletRequestEvent event) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    public void requestInitialized(ServletRequestEvent sre){
        request=(HttpServletRequest)sre.getServletRequest();
    }


    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        String sessionId = httpSessionEvent.getSession().getId();
        Timestamp createTime = new Timestamp(System.currentTimeMillis());
        String loginIp = request.getRemoteAddr();
        boolean rs = true;
        if(list.size() > 0){
            for(int i = 0;i < list.size(); i ++){
                if(loginIp.equals(list.get(i))){
                    rs = false;
                }
            }
        }
        if(rs){                      //如果队列中存在相同的IP 则SESSION不增加
            list.add(loginIp);
            System.out.println("ipList队列新增ip: "+loginIp);
            activeSessions++;
            System.out.println("新增SESSION,sessionId = " + sessionId +"; createTime = " + createTime
                             + "; loginIp = " + loginIp +"; 当前总SESSION值为 "+activeSessions);
        }
    }

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        String sessionId = httpSessionEvent.getSession().getId();
        Timestamp overTime = new Timestamp(System.currentTimeMillis());
        String loginIp = request.getRemoteAddr();
        if(activeSessions>0){
            if(list.size() > 0){
                for(int i = 0;i < list.size(); i ++){
                    if(loginIp.equals(list.get(i))){
                        list.remove(i);  
                        System.out.println("ipList队列移除ip: "+loginIp);
                    }
                }
            }
            activeSessions--;                   //在用户销毁的时候,从队列中踢出这个IP
            System.out.println("销毁SESSION,sessionId = " + sessionId +"; overTime = " + overTime
                             + "; loginIp = " + loginIp +"; 当前总SESSION值为 "+activeSessions);
        }
    }

    public static int getActiveSessions() {
        return activeSessions;
    }

    public void setActiveSessions(int i) {
        activeSessions = i;
    }

}

“七”乐无穷,尽在新浪新版博客,快来体验啊~~~请点击进入~

转载于:https://my.oschina.net/snowsalt/blog/3508

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球100款大数据工具汇总(51~100款)

上篇&#xff08;戳标题即可跳转&#xff09;&#xff1a;全球100款大数据工具汇总&#xff08;前50款&#xff09;51、Redis是一个高性能的key-value存储系统&#xff0c;和Memcached类似&#xff0c;它支持存储的value类型相对更多&#xff0c;包括string&#xff08;字符串&…

Android手机投屏后没有声音,乐播投屏电视没有声音怎么办_乐播投屏电视没有声音手机有声音解决办法_3DM手游...

乐播投屏是一个非常不错的投屏软件&#xff0c;操作使用简单&#xff0c;最近不少小伙伴都在用。但是在使用乐播投屏的时候&#xff0c;有很多小伙伴出现了电视没有声音手机有声音的情况&#xff0c;这是怎么回事呢&#xff1f;我们一起来看看乐播投屏电视没有声音的解决办法吧…

如何容器化你的 ASP.Net Core

Docker 相比 虚拟机 具有更轻量级&#xff0c;更便捷的特性&#xff0c;为什么这么说呢&#xff1f;虚拟机通常打包了完整的操作系统&#xff0c;而容器只仅仅打包了你的应用程序&#xff0c;运行环境及相关依赖库&#xff0c;Docker 是一种开源的工具包&#xff0c;帮助你更加…

tableau三轴合并_《Tableau数据可视化实战》——1.12节合并不同数据源-阿里云开发者社区...

本节书摘来自华章社区《Tableau数据可视化实战》一书中的第1章&#xff0c;第1.12节合并不同数据源&#xff0c;作者(美)Ashutosh Nandeshwar&#xff0c;更多章节内容可以访问云栖社区“华章社区”公众号查看1.12 合并不同数据源通常&#xff0c;我们的数据以不同格式或者不同…

android ble status,Android BLE peripheral disconnects with status code BLE_HCI_INSTANT_PASSED(0x28)

问题My application is able to connect to the BLE peripheral(which is an OBDII/J1939 device) device successfully.2018-01-24 14:58:38,413 INFO LogUtil - GATT Server Status (0) : BLE_HCI_STATUS_CODE_SUCCESS(0x00)2018-01-24 14:58:38,414 INFO LogUtil - GATT Se…

2018年大数据趋势

作者 | Keith D. Foote翻译 | 品觉笔记本电脑、智能手机、传感器&#xff0c;都为物联网带来了大量数据。这是获得竞争优势&#xff08;或者保持竞争力&#xff09;的重大机遇&#xff0c;前提是企业足够灵活&#xff0c;可以管理好数据并把数据变成有用的商业智能。人脑能高效…

关于商品分类 商品表和属性表的设计

以前有这样的一个需求,不考虑像京东或者淘宝这样分类下有子分类的情况,只考虑一层分类的情况下,可以随便添加分类,可以任意给商品添加属性,而不需要更 改表的结构. 于是设计了一个这样的结构,实现还是可以实现,一直在用,但是在操作上比较麻烦,大家讨论下有没有更好的方式. ----…

Redis五种数据结构

1、String这是最简单的Redis类型。如果只使用这种类型&#xff0c;Redis就像一个可持久化的Memcached服务器。2、ListRedis的List是基于双向链表实现的&#xff0c;可以支持反向查找和遍历。常用案例&#xff1a;聊天系统、社交网络中获取用户最新发表的帖子、简单的消息队列、…

es创建索引数量多了好还是少了好_Elasticsearch性能优化总结

Elasticsearch是目前大数据领域最热门的技术栈之一,经过近8年的发展,已从0.0.X版升级至6.X版本,虽然增加了很多的特性和功能,但是在主体架构上,还是没有太多的变化。下面就把我对于ES使用实践的一些经验总结一下,供大家参考;也请大家拍砖。 一、 硬件环境选择: 如果有条…

C# NUnit的安装

前言&#xff1a;NUnit是什么&#xff1f;NUnit 是一个单元测试框架&#xff0c;专门针对于.NET来写的。NUnit是xUnit家族种的第4个主打产品&#xff0c;完全由C#语言来编写&#xff0c;并且编写时充分利用了许多.NET的特性,比如反射,客户属性等等。最重要的一点是它适合于所有…

shiro单点登录原理_SSO单点登录三种情况的实现方式详解

单点登录(SSO——Single Sign On)对于我们来说已经不陌生了。对于大型系统来说使用单点登录可以减少用户很多的麻烦。就拿百度来说吧&#xff0c;百度下面有很多的子系统——百度经验、百度知道、百度文库等等&#xff0c;如果我们使用这些系统的时候&#xff0c;每一个系统都需…

[转]解决Windows 7下Windows Live Messenger(MSN) 9.0在一直停靠任务栏而不在系统栏显示的问题...

解决Windows 7下Windows Live Messenger(MSN) 9.0在一直停靠任务栏而不在系统栏显示的问题 用上Windows 7后&#xff0c;MSN一直停靠任务栏而不在系统栏显示&#xff0c;关闭窗口就会退出MSN&#xff0c;解决方法很简单。 1、退出MSN 2、点击“开始”菜单->Windows Live->…

中国癌症大数据出来了!每年126万例癌症死亡本可避免

01 中国本土大样本数据&#xff1a;癌症真的可预防&#xff01;2017年&#xff0c;由全国肿瘤登记中心副主任陈万青教授、美国癌症协会Farhad Islami教授牵头的生活方式和感染对中国癌症发病和死亡影响的研究&#xff0c;发表在Annals of Oncology上[1,2]。该研究由美国癌症研究…

NPOI 在指定单元格导入导出图片

NPOI 在指定单元格导入导出图片Intro我维护了一个 NPOI 的扩展(WeihanLi.Npoi)&#xff0c;主要用来导入导出 Excel 数据&#xff0c;最近有网友提出了导入 Excel 的时候解析图片的需求&#xff0c;于是就有了本文的探索导入Excel 时解析图片xls 和 xlsx 的 API 稍有不同&#…

android 设置folder类型,正确配置你的 Android 项目

简评&#xff1a;优秀的 Android 项目从配置开始。: )作者在这里介绍了一个 Android 项目应该有的配置&#xff0c;文中讲到的内容大家都可以运用在自己的 Android 模板项目中。gitignore当你新建 Android 项目时&#xff0c;默认会生成 gitignore 文件&#xff0c;但并没有包含…

人就是这样啊

人类自然的天性&#xff0c;是做错事只会责备别人&#xff0c;而绝不会责备自己&#xff0c;我们每个人都是如此。不要评议人&#xff0c;免得为人所评议。不要评批他们&#xff0c;我们在相同的情形下&#xff0c;也会像他们一样。林肯从苦痛的经验中知道&#xff0c;尖锐的评…

开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!

导读&#xff1a;AR技术飞速发展&#xff0c;被广泛应用于游戏、医疗、旅游、电商等行业。那么对于AR系统的整体设计和应用是如何操作的呢&#xff1f;商汤泰坦公开课第006期联合“SLAM技术及应用”暑期学校与研讨会共同推出“移动增强现实系统的设计与应用案例解析”&“AR…

商业项目中最受欢迎的 7 种编程语言

【导读】&#xff1a;Semaphore 是一个国外持续集成/持续部署方案服务商。Semaphore 称自己在过去三年对其开发者用户进行调查&#xff0c;调查他们在开发商业项目时一般都使用哪些语言。这些数据基于成千上万个在 Semaphore 上进行测试和部署的项目的人。所以现在这是迄今为止…

html云雾效果,PS中怎么做像这样的云雾效果?(有图)?

回答&#xff1a;制作步骤&#xff1a;1.按【CtrlO】键打开一幅风景素材图像。2.制作云彩效果。选择Photoshop CS6工具箱中的矩形选框工具 &#xff0c;在画面中绘制选区&#xff0c;使用默认前背景色。单击“图层”面板上的“创建新图层”按钮 &#xff0c;新建“图层1”在菜单…

为or、in平反——or、in到底能不能利用索引?

先说一个笑话&#xff0c;作为开场白。俺也换换风格试一试&#xff0c;呵呵。 在以前&#xff0c;有三个书生赶考&#xff0c;在路上遇到了一个算命先生&#xff0c;于是就问算命先生&#xff1a;我们三个人赶考&#xff0c;结果如何呀&#xff1f;算命先生伸出来了一个手指头&…