第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

利用監(jiān)聽(tīng)器,統(tǒng)計(jì)在線人數(shù)

標(biāo)簽:
Java

一、 利用HttpSessionListener进行监听

     1. 在session创建的时候,人数+1,在页面显示
     2. 在session销毁的时候,人数-1,在页面显示

二、 扩展一下,在页面显示来访者的详细数据 (如:ip,sessionId,第一次访问时间)

     1. 在浏览器发来请求的时候,利用ServletRequestListener进行监听,获取sessionId,

     2. 并判断sessionId是否存在,不存在就可放入到List中,在页面获取

     3. 在session销毁的时候,顺便将对应的用户从List中移除
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    private int userNumber = 0; //在线用户人数

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        userNumber++;
        se.getSession().getServletContext().setAttribute("userNumber", userNumber);
        System.out.println("用户+1");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        userNumber--;
        se.getSession().getServletContext().setAttribute("userNumber", userNumber);
        System.out.println("用户-1");

        //移除用户
        ArrayList<User> userList = null; //在线用户List
        userList = (ArrayList<User>) se.getSession().getServletContext().getAttribute("userList") ;
        if(SessionUtil.getUserBySessionId(userList, se.getSession().getId()) != null){
            userList.remove(SessionUtil.getUserBySessionId(userList, se.getSession().getId()));
        }
    }
}
@WebListener
public class MyServletRequestListener implements ServletRequestListener {

    private ArrayList<User> userList; //在线用户 List

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        userList = (ArrayList<User>) sre.getServletContext().getAttribute("userList");
        if(userList == null){
            userList = new ArrayList<>();
        }

        HttpServletRequest request =  (HttpServletRequest) sre.getServletRequest();
        String sessionIdString = request.getSession().getId();

        //验证sessionId是否存在,不存在就可放入到List中
        if(SessionUtil.getUserBySessionId(userList, sessionIdString) == null){
            User user = new User();
            user.setSessionIdString(sessionIdString);
            user.setIpString(request.getRemoteAddr());
            user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            userList.add(user);
        }
        sre.getServletContext().setAttribute("userList", userList);
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {

    }
}
public class SessionUtil {

    public static Object getUserBySessionId(ArrayList<User> userList, String sessionIdString) {

        for(User user : userList){
            if(user.getSessionIdString().equals(sessionIdString)){
                return user;
            }
        }
        return null;
    }
}

效果

发散思维

如何忽略那个不在线但session还未销毁的用户?


分析:问题的根源在于关闭浏览器后某用户的session不会立即销毁。如何忽略那个不在线,但session还未销毁的用户?做到该用户既不计数,也不输出用户信息

解答:当用户请求服务器资源时,记录用户的最后活跃时间。接着拟定一个失效时间,统计在线人数的时候,假设某个用户的最后活跃时间和当前时间的差值大于这个失效时间,也就是说该用户这一段时间都没有和服务器交互了,那么就认为该用户已下线,否则认为他是在线的。没想出百分百完美解决的方法,只能缩小误差的范围

點(diǎn)擊查看更多內(nèi)容
18人點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消