springboot使用HttpSessionListener 监听器统计当前在线人数
概括:
request.getSession(true):若存在会话则返回该会话,否则新建一个会话。
request.getSession(false):若存在会话则返回该会话,否则返回NULL
https://blog.csdn.net/qq_38091831/article/details/82912831
原理就是很简单,就是利用HttpSessionListener 监听session的创建和销毁,然后定义个静态变量存储在线人数的变化。 说两种方式,第一种是使用配置类,第二种是使用@WebListener注解,都差不多 方式一:使用配置类 1.创建session监听器 package com.sdsft.pcweb.common.listener; import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class MyHttpSessionListener implements HttpSessionListener { public static int online = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session");
online ++;
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session");
online --;
} }
2.配置类 package com.sdsft.pcweb.common.config; import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration
public class MywebConfig implements WebMvcConfigurer {
@Bean
public ServletListenerRegistrationBean listenerRegist() {
ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
srb.setListener(new MyHttpSessionListener());
System.out.println("listener");
return srb;
}
}
3.控制器 package com.sdsft.pcweb.controller; import com.sdsft.pcweb.common.entity.CommonResult;
import com.sdsft.pcweb.common.enums.ResultEnum;
import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
import com.sdsft.pcweb.service.LoginService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; /**
* LoginController class
* @author zcz
* @date 2018/09/20
*/
@RequestMapping("/userInfo")
@RestController
public class LoginController {
private static Logger logger = LoggerFactory.getLogger(LoginController.class); /**
* 登录
*/
@PostMapping("/Login")
public void getUserByUserNameAndPassword(String username, String password, HttpSession session) {
logger.info("用户【"+username+"】登陆开始!");
if("admin".equals(username) && "123456".equals(password)){
session.setAttribute("loginName",username);
logger.info("用户【"+username+"】登陆成功!");
}else{
logger.info("用户【"+username+"】登录失败!");
}
}
/**
*查询在线人数
*/
@RequestMapping("/online")
public Object online() {
return "当前在线人数:" + MyHttpSessionListener.online + "人";
}
/**
* 退出登录
*/
@RequestMapping("/Logout")
public CommonResult Logout( HttpServletRequest request) {
logger.info("用户退出登录开始!");
HttpSession session = request.getSession(false);//防止创建Session
if(session != null){
session.removeAttribute("loginName");
session.invalidate();
}
logger.info("用户退出登录结束!");
return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!");
} /**
* 判断session是否有效
* @param httpServletRequest
* @return
*/
@RequestMapping("/getSession")
public String getSession(HttpServletRequest httpServletRequest) {
HttpSession session = httpServletRequest.getSession();
String loginName = (String) session.getAttribute("loginName");
if (StringUtils.isNotBlank(loginName)) {
return "200";
}
return "";
} }
测试一下吧 方式二:使用@WebListener注解 1.创建监听器,加注解@WebListener package com.sdsft.pcweb.common.listener; import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MyHttpSessionListener implements HttpSessionListener { public static int online = 0;
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session");
online ++;
} @Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session");
online --;
} }
2.控制器 package com.sdsft.pcweb.controller; import com.sdsft.pcweb.common.entity.CommonResult;
import com.sdsft.pcweb.common.enums.ResultEnum;
import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
import com.sdsft.pcweb.service.LoginService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; /**
* LoginController class
* @author zcz
* @date 2018/09/20
*/
@RequestMapping("/userInfo")
@RestController
public class LoginController {
private static Logger logger = LoggerFactory.getLogger(LoginController.class); /**
* 登录
*/
@PostMapping("/Login")
public void getUserByUserNameAndPassword(String username, String password, HttpSession session) {
logger.info("用户【"+username+"】登陆开始!");
if("admin".equals(username) && "123456".equals(password)){
session.setAttribute("loginName",username);
logger.info("用户【"+username+"】登陆成功!");
}else{
logger.info("用户【"+username+"】登录失败!");
}
}
/**
*查询在线人数
*/
@RequestMapping("/online")
public Object online() {
return "当前在线人数:" + MyHttpSessionListener.online + "人";
}
/**
* 退出登录
*/
@RequestMapping("/Logout")
public CommonResult Logout( HttpServletRequest request) {
logger.info("用户退出登录开始!");
HttpSession session = request.getSession(false);//防止创建Session
if(session != null){
session.removeAttribute("loginName");
session.invalidate();
}
logger.info("用户退出登录结束!");
return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!");
} /**
* 判断session是否有效
* @param httpServletRequest
* @return
*/
@RequestMapping("/getSession")
public String getSession(HttpServletRequest httpServletRequest) {
HttpSession session = httpServletRequest.getSession();
String loginName = (String) session.getAttribute("loginName");
if (StringUtils.isNotBlank(loginName)) {
return "200";
}
return "";
} }
3.启动类加@ServletComponentScan注解,这样才能在程序启动时将对应的bean加载进来 package com.sdsft.pcweb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication
@ServletComponentScan
public class PcwebApplication {
public static void main(String[] args) {
SpringApplication.run(PcwebApplication.class, args);
}
}
开始测试吧
springboot统计当前在线人数,springboot使用HttpSessionListener 监听器统计当前在线人数,拿来即用,不忽悠
原理就是很简单,就是利用HttpSessionListener 监听session的创建和销毁,然后定义个静态变量存储在线人数的变化。
说两种方式,第一种是使用配置类,第二种是使用@WebListener注解,都差不多
方式一:使用配置类
1.创建session监听器
- package com.sdsft.pcweb.common.listener;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- public class MyHttpSessionListener implements HttpSessionListener {
- public static int online = 0;
- @Override
- public void sessionCreated(HttpSessionEvent se) {
- System.out.println("创建session");
- online ++;
- }
- @Override
- public void sessionDestroyed(HttpSessionEvent se) {
- System.out.println("销毁session");
- online --;
- }
- }
2.配置类
- package com.sdsft.pcweb.common.config;
- import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
- import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
- @Configuration
- public class MywebConfig implements WebMvcConfigurer {
- @Bean
- public ServletListenerRegistrationBean listenerRegist() {
- ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();
- srb.setListener(new MyHttpSessionListener());
- System.out.println("listener");
- return srb;
- }
- }
3.控制器
- package com.sdsft.pcweb.controller;
- import com.sdsft.pcweb.common.entity.CommonResult;
- import com.sdsft.pcweb.common.enums.ResultEnum;
- import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
- import com.sdsft.pcweb.service.LoginService;
- import org.apache.commons.lang3.StringUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.bind.annotation.RestController;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- /**
- * LoginController class
- * @author zcz
- * @date 2018/09/20
- */
- @RequestMapping("/userInfo")
- @RestController
- public class LoginController {
- private static Logger logger = LoggerFactory.getLogger(LoginController.class);
- /**
- * 登录
- */
- @PostMapping("/Login")
- public void getUserByUserNameAndPassword(String username, String password, HttpSession session) {
- logger.info("用户【"+username+"】登陆开始!");
- if("admin".equals(username) && "123456".equals(password)){
- session.setAttribute("loginName",username);
- logger.info("用户【"+username+"】登陆成功!");
- }else{
- logger.info("用户【"+username+"】登录失败!");
- }
- }
- /**
- *查询在线人数
- */
- @RequestMapping("/online")
- public Object online() {
- return "当前在线人数:" + MyHttpSessionListener.online + "人";
- }
- /**
- * 退出登录
- */
- @RequestMapping("/Logout")
- public CommonResult Logout( HttpServletRequest request) {
- logger.info("用户退出登录开始!");
- HttpSession session = request.getSession(false);//防止创建Session
- if(session != null){
- session.removeAttribute("loginName");
- session.invalidate();
- }
- logger.info("用户退出登录结束!");
- return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!");
- }
- /**
- * 判断session是否有效
- * @param httpServletRequest
- * @return
- */
- @RequestMapping("/getSession")
- public String getSession(HttpServletRequest httpServletRequest) {
- HttpSession session = httpServletRequest.getSession();
- String loginName = (String) session.getAttribute("loginName");
- if (StringUtils.isNotBlank(loginName)) {
- return "200";
- }
- return "";
- }
- }
测试一下吧
方式二:使用@WebListener注解
1.创建监听器,加注解@WebListener
- package com.sdsft.pcweb.common.listener;
- import javax.servlet.http.HttpSessionEvent;
- import javax.servlet.http.HttpSessionListener;
- @WebListener
- public class MyHttpSessionListener implements HttpSessionListener {
- public static int online = 0;
- @Override
- public void sessionCreated(HttpSessionEvent se) {
- System.out.println("创建session");
- online ++;
- }
- @Override
- public void sessionDestroyed(HttpSessionEvent se) {
- System.out.println("销毁session");
- online --;
- }
- }
2.控制器
- package com.sdsft.pcweb.controller;
- import com.sdsft.pcweb.common.entity.CommonResult;
- import com.sdsft.pcweb.common.enums.ResultEnum;
- import com.sdsft.pcweb.common.listener.MyHttpSessionListener;
- import com.sdsft.pcweb.service.LoginService;
- import org.apache.commons.lang3.StringUtils;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import org.springframework.web.bind.annotation.RestController;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpSession;
- /**
- * LoginController class
- * @author zcz
- * @date 2018/09/20
- */
- @RequestMapping("/userInfo")
- @RestController
- public class LoginController {
- private static Logger logger = LoggerFactory.getLogger(LoginController.class);
- /**
- * 登录
- */
- @PostMapping("/Login")
- public void getUserByUserNameAndPassword(String username, String password, HttpSession session) {
- logger.info("用户【"+username+"】登陆开始!");
- if("admin".equals(username) && "123456".equals(password)){
- session.setAttribute("loginName",username);
- logger.info("用户【"+username+"】登陆成功!");
- }else{
- logger.info("用户【"+username+"】登录失败!");
- }
- }
- /**
- *查询在线人数
- */
- @RequestMapping("/online")
- public Object online() {
- return "当前在线人数:" + MyHttpSessionListener.online + "人";
- }
- /**
- * 退出登录
- */
- @RequestMapping("/Logout")
- public CommonResult Logout( HttpServletRequest request) {
- logger.info("用户退出登录开始!");
- HttpSession session = request.getSession(false);//防止创建Session
- if(session != null){
- session.removeAttribute("loginName");
- session.invalidate();
- }
- logger.info("用户退出登录结束!");
- return new CommonResult(ResultEnum.SUCCESS.getCode(), "退出成功!");
- }
- /**
- * 判断session是否有效
- * @param httpServletRequest
- * @return
- */
- @RequestMapping("/getSession")
- public String getSession(HttpServletRequest httpServletRequest) {
- HttpSession session = httpServletRequest.getSession();
- String loginName = (String) session.getAttribute("loginName");
- if (StringUtils.isNotBlank(loginName)) {
- return "200";
- }
- return "";
- }
- }
3.启动类加@ServletComponentScan注解,这样才能在程序启动时将对应的bean加载进来
- package com.sdsft.pcweb;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.web.servlet.ServletComponentScan;
- @SpringBootApplication
- @ServletComponentScan
- public class PcwebApplication {
- public static void main(String[] args) {
- SpringApplication.run(PcwebApplication.class, args);
- }
- }
开始测试吧
springboot使用HttpSessionListener 监听器统计当前在线人数的更多相关文章
- Servlet监听器统计网站在线人数
本节我们利用 Servlet 监听器接口,完成一个统计网站在线人数的案例.当一个用户登录后,显示欢迎信息,同时显示出当前在线人数和用户名单.当用户退出登录或 Session 过期时,从在线用户名单中删 ...
- Servlet监听器统计在线人数
监听器的作用是监听Web容器的有效事件,它由Servlet容器管理,利用Listener接口监听某个执行程序,并根据该程序的需求做出适应的响应. 例1 应用Servlet监听器统计在线人数. (1)创 ...
- 监听器的配置,绑定HttpSessionListener监听器的使用
监听器的配置,绑定 <listener> <listener-class>监听器的全路径</listener-class> </listener> Se ...
- java-web项目:用servlet监听器实现显示在线人数
1.创建一个监听器 package com.listener; import javax.servlet.ServletContext; import javax.servlet.http.HttpS ...
- 用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
在线人数统计方面的实现,最初我的想法是,管理session,如果session销毁了就减少,如果登陆用户了就新增一个,但是如果是用户非法退出,如:未注销,关闭浏览器等,这个用户的session是管理不 ...
- [转]用HttpSessionListener与HttpSessionBindingListener实现在线人数统计
原文链接:http://www.cnblogs.com/shencheng/archive/2011/01/07/1930227.html 下午比较闲(其实今天都很闲),想了一下在线人数统计方面的实现 ...
- javaEE之--------统计站点在线人数,安全登录等(观察者设计模式)
整体介绍下: 监听器:监听器-就是一个实现待定接口的普通Java程序,此程序专门用于监听别一个类的方法调用.都是使用观察者设计模式. 小弟刚接触这个,做了些简单的介绍.大神请绕道,技术仅仅是一点点, ...
- java监听器之实现在线人数显示
在码农的世界里只有bug才能让人成长,The more bugs you encounter, the more efficient you will be! java中的监听器分为三种:Servle ...
- 使用session的监听器获取当前在线人数
1首先在web.xml中配置Session的监听器 2创建监听器并且继承HttpSessionListener 3.在jsp中导入监听器 4.获取当前在线人数 5.配置到公共网络(使用natapp的免 ...
随机推荐
- Hadoop FairScheduler
目标 本文档描述FairScheduler,一个允许YARN应用程序公平共享集群资源的调度插件. 概述 公平调度是一个分配资源给所有application的方法,平均来看,是随着时间的进展平等分享资源 ...
- linux操作系统与jvm
线程调度 https://www.cnblogs.com/xiaotlili/p/3510224.html
- js -ajax 学习
2.ajax 1)跨域 $.ajax({ type : "get", data : "data_xName=" + data_xNa ...
- 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等
参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...
- [Beta阶段]第八次Scrum Meeting
Scrum Meeting博客目录 [Beta阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/05/14 大运村寝室6楼 25min ...
- Oracle 导出表结构
Oracle导出表结构 select A.Table_Name 表名 , -- A.column_name 字段名 A.column_name 字段名, A.data_type 数据类型, A.dat ...
- NIO网络访问模式实践
1.创建NioNest12类 一个线程监听5个端口的事件 public class NioTest12 { public static void main(String[] args) throws ...
- python lambda表达式简单用法【转】
python lambda表达式简单用法 1.lambda是什么? 看个例子: g = lambda x:x+1 看一下执行的结果: g(1) >>>2 g(2) >>& ...
- shell (7)if 表达式
文件表达式if [ -f file ] 如果文件存在if [ -d … ] 如果目录存在if [ -s file ] 如果文件存在且非空if [ -r file ] 如果文件存在且可读if [ -w ...
- matlab学习笔记13_2匿名函数
一起来学matlab-matlab学习笔记13函数 13_2 匿名函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://ww2.mathworks.cn/help/m ...