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
打开一个浏览器客户端就有个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
相关文章推荐
- java 实现统计在线人数
- [java]HttpSessionListener实现统计在线人数
- 用java统计网站在线人数
- Java监听器学习 统计当前在线人数
- java 统计在线人数(2)
- Java 版本 Redis 统计7天连续在线用户人数
- javaweb中实现在线人数统计
- Java统计学习之道:统计java网站访问量和在线人数
- java统计在线人数
- 统计java网站访问量和在线人数
- java 统计网站在线人数
- JavaWeb中的Session、SessionListener、在线人数统计
- 使用java 监听器实现在线人数统计
- javaweb中实现在线人数统计
- java实现在线人数统计 (2011-05-30 15:10)
- javaWeb 在线人数统计
- Java Web开发——在线人数统计程序
- java web 项目中通过session 统计在线访问人数
- 用java统计网站在线人数
- java 实现统计在线人数