2 u012555791 u012555791 于 2016.03.25 08:11 提问

求大神过来看看,web系统java开发的,中间件用的是tomcat,如果像控制用户登录数怎么解决 1C

求大神过来看看,web系统java开发的,中间件用的是tomcat,如果像控制用户登录数怎么解决?想做一个如果用户数连接达到500人,那么再有新用户访问网站就跳转到友好界面,如何做?是在TOMCAT里面可以设置,还是程序里面可以控制,求代码方案

7个回答

qq_20039385
qq_20039385   2016.03.25 08:57

浏览器关闭了session就销毁了,不管是正常关闭还是非正常关闭,正常退出时销毁session,浏览器关闭也会销毁session,所有你要在session监听器里面实现你的用户登出(也就是销毁session)时-1的操作。

u012555791
u012555791 浏览器关闭了,session得等到session过期时间到了才会销毁的。。我试过了
一年多之前 回复
fubo1990
fubo1990   2016.03.25 09:25

1.创建一个登录用户表。存放用户信息,及sessionCreateTime,session第一次创建生成的(下面写的Listener中有专门的生成)作用是当session失效时候可以找到通过它找到该登录用户信息,并删除这条信息。
2.当用户登录成功,网用户登录表中插入一条用户信息记录。并且要从通过session.getAttribute("sessionCreateTime")获得sessionCreateTime,
也一并存入用户登录表中。当用户退出时候,删除该用户在登录用户表中的用户记录。
3.在每个用户登录时候,查一下登录用户表的中记录数量。如果数量达到上限。直接返回一个提示信息页。如果没达到上限可以继续登录。

2创建一个监听器类。
01.public class SessionListener implements HttpSessionListener{

02. //session创建时候执行下面的方法

03. public void sessionCreated(HttpSessionEvent event) {

04. HttpSession session = event.getSession();

05. String id=session.getId()+session.getCreationTime();

06. session.setAttribute("sessionCreateTime",session);

07.}

08.

09. public void sessionDestroyed(HttpSessionEvent event) {

10. HttpSession session = event.getSession();

11. String sessionCreateTime = session.getAttribute("sessionCreateTime");
12. synchronized (this) {

13. 此处通过 sessionCreateTime删除用户表中该记录。
15. }

16. }

17.}

在web.xml添加上面监听器的配置。




com.demo.SessionListener



wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.03.25 09:28

控制用户登录个数一般使用Filter过滤器,当用户请求登陆页面时,使用全局变量记录登陆用户数量。

u012555791
u012555791 利用Filter过滤器的确可以知道多少用户登陆了,但是无法在session过期前准确统计多少用户是直接关闭浏览器退出的
一年多之前 回复
qq978450288
qq978450288   2016.03.25 10:32

你的困扰是session过期前准确统计多少用户, 但 你也要思考 如果session没过期 难道你要没1分钟强制登出 没有新请求的用户么?
那这样也是完全不合理的 用户发呆几十秒 或者填个表单的功夫就被你登出了。

也就是说 你无法判断 当前session 存在 但已经关闭浏览器的这部分用户。 我建议你换个思路,通过并发访问量。 当前项目线程数之类的 分析本次请求是否要跳转页面。
大于500

fytfyt1
fytfyt1   2016.03.28 00:02

可以定义一个全局变量,每次注册一个用户加一,直到加到500就提示

luochoudan
luochoudan   Ds   Rxr 2016.03.27 15:30

个人觉得还是从并发方面考虑更合适些。

u011489205
u011489205   2016.03.25 08:14

维护一个应用级别的全局变量,登录+1,登出-1,在拦截器或者过滤器里做在线人数判断。

ligang7560
ligang7560 回复wangyang12611: 采用轮询的模式啊,假如说每隔5秒钟,让客户端请求一次服务器,证明自己还在登陆状态,如果过了10秒,两次没有收到请求,就把他当作下线了处理就可以了
一年多之前 回复
u012555791
u012555791 当时我也做过这个设想,但是系统是在线观看视频的系统,所以在线时间很长,session过期时间时间也很长,如果是正常登出那么可以准确判断,但是用户是直接关闭浏览器或非正常关闭,就无法准确判断了
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!