简单网站人数统计实现

实现思路:

SessionListener监听session的创建与销毁
ServletContext中维护用户访数据,

1. 用户登陆:

用户登陆操作成功时,把用户ID sessionID以及其他需要的信息存放到ServletContext

2. 用户退出:

a.正常退出:销毁session 移除ServletContext里的用户信息
b.非正常退出:设置session有效时间,监听器监听session状态,session失效时, 移除ServletContext

里的用户信息

具体实现:

SessionListener

@WebListener
public class UserSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // 设置session失效时间
        se.getSession().setMaxInactiveInterval(60 * 60);
    }

    /*
     * 用户非正常退出时 session失效销毁,移除用户在ServletContext中Map里的信息 ,并修改用户状态(non-Javadoc)
     * 
     * @see
     * javax.servlet.http.HttpSessionListener#sessionDestroyed(javax.servlet.http.
     * HttpSessionEvent)
     */
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        destroyed(se);
    }

    @SuppressWarnings("unchecked")
    private synchronized void destroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        ServletContext application = session.getServletContext();
        String sessionId = session.getId();
        Map<Integer, String> userSessions = (Map<Integer, String>) application.getAttribute("userSessions");
        if (userSessions != null && !userSessions.isEmpty() && !StringUtils.isEmpty(sessionId)) {
            Iterator<Integer> iterator = userSessions.keySet().iterator();
            while (iterator.hasNext()) {
                Integer uid = iterator.next();
                if (sessionId.equals(userSessions.get(uid))) {
                    // 移除用户信息
                    iterator.remove();

                    // 修改用户状态为离线
                    IMService imservice = (IMService) WebApplicationContextUtils.getWebApplicationContext(application)
                            .getBean(IMService.class);
                    LUserService lUserService = (LUserService) WebApplicationContextUtils
                            .getWebApplicationContext(application).getBean(LUserService.class);

                    IMUser imuser = new IMUser(uid, "offline");
                    imservice.updateByPrimaryKeySelective(imuser);
                    // 修改用户退出时间
                    T_User user = new T_User();
                    user.setUid(uid);
                    user.setExitTime(new Date());
                    lUserService.updateExitTime(user);
                    System.err.println("用户退出,在线人数:" + userSessions.size());
                }
            }
        }
    }
}

SessionUtil

public class SessionUtils {

    private static class SessionUtil {
        private static final SessionUtils INSTANCE = new SessionUtils();
    }

    private SessionUtils() {
    }

    public static SessionUtils getInstance() {
        return SessionUtil.INSTANCE;
    }

    /**
     * 用户登陆 把用户ID 和 sessionId 添加到 Map userSessions中
     * 
     * @param session
     * @param uid
     */
    @SuppressWarnings("unchecked")
    public synchronized void setSession(HttpServletRequest request, Integer uid) {
        HttpSession session = request.getSession();
        ServletContext application = getServletContext(session);
        Map<Integer, String> userSessions = (Map<Integer, String>) application.getAttribute("userSessions");
        if (userSessions == null) {
            userSessions = new HashMap<>();
            userSessions.put(uid, session.getId());
            application.setAttribute("userSessions", userSessions);
        } else {
            userSessions.put(uid, session.getId());
        }
        System.err.println("用户登陆,在线人数:" + userSessions.size());
        PageViewUtils.getInstance().setNum(request, uid);

    }

    synchronized ServletContext getServletContext(HttpSession session) {
        return session.getServletContext();
    }

    @SuppressWarnings("unchecked")
    public synchronized void invalidateSession(HttpSession session) {
        ServletContext application = getServletContext(session);
        String key = session.getId();
        Map<Integer, String> userSessions = (Map<Integer, String>) application.getAttribute("userSessions");
        if (userSessions != null && !userSessions.isEmpty() && !StringUtils.isEmpty(key)) {
            Iterator<Integer> iterator = userSessions.keySet().iterator();
            while (iterator.hasNext()) {
                Integer keys = iterator.next();
                if (key.equals(userSessions.get(keys))) {
                    iterator.remove();
                }
            }
            System.err.println("退出登陆,在线人数:" + userSessions.size());
        }
        session.invalidate();
    }
}

PageViewUtils

public class PageViewUtils {
    private static class PageViewUtil {
        private static final PageViewUtils INSTANCE = new PageViewUtils();
    }

    private PageViewUtils() {
    }

    public static PageViewUtils getInstance() {
        return PageViewUtil.INSTANCE;
    }

    private synchronized ServletContext getServletContext(HttpServletRequest request) {
        return request.getServletContext();
    }

    @SuppressWarnings("unchecked")
    public synchronized void setNum(HttpServletRequest request, Integer uid) {
        ServletContext application = getServletContext(request);
        // 当日访问总人数
        Map<Integer, Date> userNum = (Map<Integer, Date>) application.getAttribute("userNum");
        if (userNum == null) {
            userNum = new HashMap<>();
            userNum.put(uid, new Date());
            application.setAttribute("userNum", userNum);
        } else {
            userNum.put(uid, new Date());
        }
        System.err.println("总人数:" + userNum.size());

        // 每小时 时间段内访问人数
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        // 当前小时
        int h = calendar.get(Calendar.HOUR_OF_DAY);
        Map<Integer, Set<Integer>> hourlyUserNum = (Map<Integer, Set<Integer>>) application
                .getAttribute("hourlyUserNum");
        if (hourlyUserNum == null) {
            hourlyUserNum = new HashMap<>();
            for (int i = 0; i < 24; i++) {
                hourlyUserNum.put(i, new HashSet<Integer>());
            }
            Set<Integer> set = new HashSet<>();
            set.add(uid);
            hourlyUserNum.put(h, set);
            application.setAttribute("hourlyUserNum", hourlyUserNum);
        } else {
            Set<Integer> set = hourlyUserNum.get(h);
            set.add(uid);
            hourlyUserNum.put(h, set);
        }
        System.err.println("时间段访问人数:" + hourlyUserNum.get(h).size());
    }
}

UserController

@Controller
@RequestMapping({ "/luser" })
public class LUserController {
    @Resource
    private LUserService LS;
    @RequestMapping(value = { "/login" }, method = {
            org.springframework.web.bind.annotation.RequestMethod.POST }, produces = { "text/plain;charset=UTF-8" })
    @ResponseBody
    public String login22(Model model, HttpServletRequest request, @RequestBody Map<String, String> map,
            HttpServletResponse response) {
        String uphone = (String) map.get("uphone");
        String pwd = (String) map.get("pwd");

        T_User user = new T_User();
        user.setPwd(pwd);
        user.setUphone(uphone);
        user = this.LS.login(user);
        if (user != null) {
                SessionUtils.getInstance().setSession(request, user.getUid());
            return "success";
        }
        return "账号或密码错误";
    }


    @RequestMapping({ "/outlogin" })
    public ResponseEntity<JSONObject> outlogin(HttpServletRequest request) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("code", Integer.valueOf(200));
        jsonObject.put("url", "jsp/indexdeom");
        try {
            Cookie[] cookies = request.getCookies();
            String value = null;
            Cookie[] arrayOfCookie1;
            int j = (arrayOfCookie1 = cookies).length;
            for (int i = 0; i < j; i++) {
                Cookie cookie = arrayOfCookie1[i];
                if (cookie.getName().equals(Md5Utils.getMd5("shuserlogin"))) {
                    value = cookie.getValue();
                }
            }
            if (value != null) {
                this.stringRedisTemplate.delete(value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            SessionUtils.getInstance().invalidateSession(request.getSession());
        }
        return ResponseEntity.ok(jsonObject);
    }
}
/**
 * 定时任务 用于数据统计
 *
 */
@Component
public class TaskPageViewController implements BaseTaskController {
    @Resource
    LUserService lUserService;
    @Resource
    PageviewService pageviewService;
    @Resource
    NewMemberService newMemberService;
    @Resource
    IMService imservice;

    @SuppressWarnings("unchecked")
    @Override
    @Scheduled(cron = "0 0 0/1 * * ? ")
    public void Task() {
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        ServletContext servletContext = webApplicationContext.getServletContext();
        Integer integer = 0;
        Map<Integer, Set<Integer>> hourlyUserNum = (Map<Integer, Set<Integer>>) servletContext
                .getAttribute("hourlyUserNum");
        if (hourlyUserNum != null && !hourlyUserNum.isEmpty()) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            int i = calendar.get(Calendar.HOUR_OF_DAY);
            integer = hourlyUserNum.get(i).size();
        }
        Integer integer2 = 0;
        Map<Integer, Date> s1 = (Map<Integer, Date>) servletContext.getAttribute("userNum");
        if (s1 != null && !s1.isEmpty()) {
            integer2 = s1.size();
            Calendar calendar = Calendar.getInstance();
            int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);
            if (hourOfDay == 23) {
                s1.clear();
            }
        }
        System.err.println("人数统计{小时内访问人数 :" + integer + "今日访问总人数:" + integer2 + "}");
        setNum(new Date(), integer, integer2);
    }

    public int setNum(Date date, Integer integer, Integer integer2) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        int i = calendar.get(Calendar.HOUR_OF_DAY);
        String tdate = new SimpleDateFormat("yyyyMMdd").format(date);
        Pageview selectByPrimaryKey = pageviewService.selectByPrimaryKey(tdate);
        Pageview pageview;
        int r;
        if (selectByPrimaryKey != null) {
            pageview = selectByPrimaryKey;
            Pageview set = StatisticsUtil.setPageview(pageview, i, integer);
            StatisticsUtil.pageviewNotNull(set);
            if (set.getTotal() < integer2) {
                set.setTotal(integer2);
            }
            r = pageviewService.updateByPrimaryKey(set);
        } else {
            pageview = new Pageview();
            pageview.setTdate(tdate);
            Pageview pageview2 = StatisticsUtil.setPageview(pageview, i, integer);
            StatisticsUtil.pageviewNotNull(pageview2);
            pageview2.setTotal(integer2);
            r = pageviewService.insert(pageview2);
        }
        return r;
    }
}


猜你喜欢

转载自blog.csdn.net/sjbzl/article/details/77047119
今日推荐