强制下线的实现

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import cn.readsty.entity.User;

/**
*
* @author linkboyhot@sohu.com
*
*/
public class UserSessionListener implements HttpSessionListener{
/**保存sessionID和user的映射 */
private static Map<String,User> userPool = new HashMap<String,User>();
/**以下是实现HttpSessionListener中的方法**/
public void sessionCreated(HttpSessionEvent se){
}

public void sessionDestroyed(HttpSessionEvent se){
userPool.remove( se.getSession().getId() );
}
/*
* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法
* @param sUser -登录的用户Bean
* @return boolean-该用户是否已经登录过的标志
*/
public static boolean isAlreadyEnter(HttpSession session,User sUser){
boolean flag = false;
if(isHas(sUser)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户是否在userPool中)
flag = true;
//遍历原来的userPool,删除原用户名对应的sessionID(即删除原来的sessionID和User)
User user;
for(String key : userPool.keySet()){
user = userPool.get(key);
if(sUser.equals(user)){
userPool.remove(key);
}
}
userPool.put( session.getId(),sUser);//添加现在的sessionID和username
}
else{//如果该用户没登录过,直接添加现在的sessionID和User
flag = false;
userPool.put( session.getId(),sUser );
}
return flag;
}

public static boolean isHas(User user){
if(null != user){
for(String key : userPool.keySet()){
if(user.equals(userPool.get(key))){
return true;
}
}
}
return false;
}
/*
* isOnline-用于判断用户是否在线
* @param session HttpSession-登录的用户名称
* @return boolean-该用户是否在线的标志
*/
public static boolean isOnline(HttpSession session){
boolean flag = true;
if( userPool.containsKey( session.getId() ) ){
flag = true;
}
else{
flag = false;
}
return flag;
}
}


import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import cn.readsty.common.UserSessionListener;
import cn.readsty.service.manager.Constant;

/**
* 过滤器用于过滤用户是否登录
* @author linkboyhot@sohu.com
*
*/
public class IsLoginFilter implements Filter {

public void destroy() {
// TODO Auto-generated method stub

}

public void doFilter(ServletRequest cRequest, ServletResponse cResponse,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest)cRequest;
HttpServletResponse response = (HttpServletResponse)cResponse;
HttpSession session = request.getSession();
/**如果session中没有保存用户的登录信息*/
if(null == session.getAttribute(Constant.USER_INFO_IN_SESSION)){
request.setAttribute("message", 2);
request.getRequestDispatcher("/logout.jsp").forward(request, response);
/**如果在线用户池中无该用户*/
}else if(!UserSessionListener.isOnline(session)){
request.setAttribute("message", 3);
request.getRequestDispatcher("/logout.jsp").forward(request, response);
}else{
chain.doFilter(cRequest,cResponse);
}

}



public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值