您的位置:首页 > 编程语言 > Java开发

java统计在线人数详解|

2011-10-24 20:39 411 查看
.一个账号登进去了,再用这个账号就登不进去:

打开一个浏览器客户端就有个sessionid与服务器对用,关闭后客户端的没了,但是服务端的还有这个session,

缺点:所以非法关闭的话,没有调用session.invalidate()方法的话,这个session依然存在。只有等到session过期,一般30分钟。这样用户要等这么长时间,肯定不好,所以尽可能的要捕捉非法关闭的事件,网上搜了,有些事件不好捕获,如先最小化在关闭等。

2.一个账号登进去了,再用这个账号登进去,前一个session失效,提示账户已经在别处登录。

缺点:如果也是非法关闭。用户有没有重新登录,session没有释放,在线统计不太对,有点就是不影响用户使用,可以继续登进去使用。

所以选择第二种:

struts2

1.action里的某个方法,

public void totalcount()

{ httpservletrequest request = servletactioncontext.getrequest();

httpsession session = request.getsession();

//就是获取用户名,因为是struts2可以这样获取

string username = user.getfirstname();

// 把用户名放入在线列表

map<string,string> onlineuserlist = (map<string,string>) servletactioncontext.getservletcontext().getattribute("onlineuserlist");

// 第一次使用前,需要初始化

if (onlineuserlist == null) {

onlineuserlist = new hashmap<string,string>();

}

//用户名一样,sessionid不一样,所以是二次登录 if(onlineuserlist.containskey(username) && !(onlineuserlist.get(username).equals(session.getid())) )

{

onlineuserlist.remove(username);

}

session.setattribute("username", username);

onlineuserlist.put(username,session.getid());

servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);

}

复制代码

2.listener,销毁session,只要调用session.invalidate()就会执行

public class userlistener implements httpsessionlistener {

public void sessioncreated(httpsessionevent event) {

}

@suppresswarnings("unchecked")

public void sessiondestroyed(httpsessionevent event) {

httpsession session = event.getsession();

// 取得登录的用户名

string username = (string) session.getattribute("username");

servletcontext application = session.getservletcontext();

system.out.println("listener开始");

system.out.println("sessionid:"+session.getid());

system.out.println("username:"+username);

// 获取在线列表

map<string,string> onlineuserlist = (map<string,string>) application.getattribute("onlineuserlist");

//session超时删除用户,重复登录登录时已删除,不再删了

if(onlineuserlist.containskey(username) && (onlineuserlist.get(username).equals(session.getid())) )

{

onlineuserlist.remove(username);

servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);

}

system.out.println("onlineuserlist:"+onlineuserlist);

system.out.println("listener结束");

}

}

3.filter

public class userfilter implements filter {

public void init(filterconfig config) throws servletexception {

}

public void destroy() {

}

@suppresswarnings("unchecked")

public void dofilter(servletrequest req, servletresponse res,

filterchain chain) throws ioexception, servletexception {

httpservletrequest request = (httpservletrequest) req;

httpservletresponse response = (httpservletresponse) res;

httpsession session = request.getsession();

system.out.println("过滤filter开始");

// 从servletcontext中取出list

map<string, string> sessionlist = (map<string, string>) session

.getservletcontext().getattribute("onlineuserlist");

system.out.println("sessionlist:" + sessionlist);

if (sessionlist == null) {

sessionlist = new hashmap<string, string>();

}

string username = (string) session.getattribute("username");

system.out.println("username:" + username);

system.out.println("sessionid:" + session.getid());

//因为过滤所有页面web.xml配置的是/*,第一次登陆username为空,得让可以登录

if (null == username) {

chain.dofilter(req, res);

system.out.println("过滤filter结束username=null");

} else {

// 用于记录状态

boolean temp = false;

system.out.println(sessionlist.containskey(username));

system.out.println(sessionlist.get(username));

system.out.println(sessionlist.get(username)

.equals(session.getid()));

if (sessionlist.containskey(username)

&& sessionlist.get(username).equals(session.getid())) {

// session值与当前id匹配,说明同一个用户

temp = true;

system.out.println("过滤filter结束,同一个用户");

}

// 存在了第二次登陆,销毁session

system.out.println("temp:" + temp);

if (!temp) {

session.invalidate();

response.setcharacterencoding("utf-8");

response.setcontenttype("text/html; charset=utf-8");

//转向的首页,根据自己项目

response

.getwriter()

.print(

"<script>window.top.location.href='/ssh2/save.jsp';alert('该账号已经在别处登录,请联系管理员或关闭ie,重新登录!');</script>");

} else {

chain.dofilter(req, res);

}

}

}

}

复制代码
web.xml的配置。

filter放在struts2拦截器的前面

<filter>

<filter-name>userfilter</filter-name>

<filter-class>

com.test.action.user.userfilter

</filter-class>

</filter>

<filter-mapping>

<filter-name>userfilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter>

复制代码

listener的配置

调用session.invalide()的方法会被监听到,销毁session

<listener>

<listener-class>com.test.action.user.userlistener</listener-class>

</listener>

复制代码

转载自:http://www.csdnjava.com/forum.php?mod=viewthread&tid=742
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: