HttpSession
session
就是一系列某用户和服务器间的通讯。服务器有能力分辨出不同的用户,
一个session
的建立是从一个用户向服务器发第一个请求开始,而以用户显式结束或session
超时为结束。
工作原理:
1.当一个用户向服务器发送第一个请求时,服务器为其建立一个session
,
并为此session
创建一个标识号
2.这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session
这种机制不使用IP
作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。
对于session
标识号sessionID
,session
的实现主要两种方式:cookie
(首选默认)与url
重写
具体分析可以参考
https://blog.csdn.net/championhengyi/article/details/72855552
HttpSessionListener
HttpSessionListener
定义的两个方法:sessionCreated()
和sessionDestroyed()
这两个方法可以监听到当前应用中session
的创建和销毁情况
主要用于统计在线人数和记录访问日志,记录访问时间、访问的ip
一个HttpSession
可以注册多个HttpSessionListener
接口,
一个web
应用中可以有多个HttpSession
对象
HttpSessionListener源码
public interface HttpSessionListener extends EventListener {
default void sessionCreated(HttpSessionEvent se) {
}
default void sessionDestroyed(HttpSessionEvent se) {
}
}
HttpSessionListener监听器实现代码
非SpringBoot下
public class OnLineCount implements HttpSessionListener{
private final Logger log = LoggerFactory.getLogger(getClass());
static int count=0;
@Override
public synchronized void sessionCreated(HttpSessionEvent se) {
count++;
se.getSession().getServletContext().setAttribute("count", count);
log.info("count++ 增加");
}
@Override
public synchronized void sessionDestroyed(HttpSessionEvent se) {
count--;
se.getSession().getServletContext().setAttribute("count", count);
log.info("count-- 减少");
}
}
然后在web.xml
中配置监听器
<listener>
<listener-class>监听器类所在路径.监听器名字</listener-class>
</listener>
在SpringBoot中需要加上@WebListener
@WebListener
public class OnLineCount implements HttpSessionListener{
private final Logger log = LoggerFactory.getLogger(getClass());
static int count=0;
@Override
public synchronized void sessionCreated(HttpSessionEvent se) {
count++;
se.getSession().getServletContext().setAttribute("count", count);
log.info("count++ 增加");
}
@Override
public synchronized void sessionDestroyed(HttpSessionEvent se) {
count--;
se.getSession().getServletContext().setAttribute("count", count);
log.info("count-- 减少");
}
}
需要在启动类加上@ServletComponentScan
说明:
1.getSession().getServletContext().setAttribute()
设置上下文的session
对象
2.这里用synchronized
防止并发,但是推荐使用int
的原子类实现++
操作,可参考https://www.jianshu.com/p/f9fea6295db8
controller
层演示用户登录
@RestController
public class IndexController {
@RequestMapping("/count")
public String count(HttpServletRequest httpServletRequest){
HttpSession session = httpServletRequest.getSession();
return "count : "+session.getServletContext().getAttribute("count");
}
}
httpServletRequest.getSession()
从请求中提取HttpSession对象,如果没有自动创建
session.getServletContext().getAttribute()
取出上下文的session
对象,也就是登录人数
关于session相关参数设置,都可以在application.yml
配置文件中配置
配置session
超时时间(默认30分钟)
server:
servlet:
session:
timeout: 60m
启动测试
image.png同一电脑中
在同一浏览器无论打开多少次都是同一个session
,
在不同浏览器打开才会产生不同的session
Session(HttpSession)
服务器会为每个会话创建一个session
对象,所以session
中的数据可供当前会话中所有servlet
共享。
会话:用户打开浏览器会话开始,直到关闭浏览器会话才会结束。一次会话期间只会创建一个session
对象。
作用域:request<session<application
HttpSession
具体方法和使用可参考官方文档:
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html
深入了解HttpSession
可以参考
https://www.cnblogs.com/shenbing/p/5372717.html
网友评论