统计在线人数重复登录

[align=left]防止web应用同一个账户重复登录一般有一下两种方式:
session实现
1.一个账号登进去了,再用这个账号就登不进去:
打开一个浏览器客户端就有个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>

大概实现了,可能考虑不周:如果有问题共同探讨。[/align]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值