用户强制退出

1、在这里使用的是一个监听器,具体类如下所示:

public class SessionListener implements HttpSessionListener{

	// 保存当前登录的用户民
	public static Map<HttpSession, String> loginUser = new HashMap<HttpSession, String>();

	public static HashMap hashUserName = new HashMap<>(); // 保存sessionID和username的映射

	// 用这个作为session中的key
	public static String SESSION_LOGIN_NAME = "username";

	// session创建时调用这个方法
	public void sessionCreated(HttpSessionEvent hse) {
	}

	// session失效或者过期时调用这个方法
	public void sessionDestroyed(HttpSessionEvent hse) {
		// 如果session过期,则从map中移除这个用户
		hashUserName.remove(hse.getSession().getId());
	}

	/**
	 * 用于判断这个用户是否已经登录
	 */
	public static boolean isOnline(HttpSession session) {
		return hashUserName.containsKey(session.getId()); 
	}

	/**
	 * 用于建立用户session
	 */
	@SuppressWarnings("unchecked")
	public static void createUserSession(HttpSession session, String sessionUserName) throws Exception {
		hashUserName.put(session.getId(), sessionUserName);
	}

	/**
	 * 根据用户名剔除session
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void removeUserSession(String sessionUserName) throws Exception {
		Iterator iter = hashUserName.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry entry = (Map.Entry) iter.next();
			Object key = entry.getKey();
			Object val = entry.getValue();
			if (((String) val).equals(sessionUserName)) {
				hashUserName.put(key, null);
				iter.remove();
				// hashUserName.remove(key);//当使用 fail-fast iterator 对
				// Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map
				// 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException
				// 异常也将被抛出。
			}
		}
	}

	/**
	 * 用户已经登录则进行session剔除,否则建立新的session
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public static void replaceUserSession(HttpSession session, String sessionUserName) throws Exception {
		if (hashUserName.containsValue(sessionUserName)) {// 如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hashUserName中)
			// 遍历原来的hashUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
			Iterator iter = hashUserName.entrySet().iterator();
			while (iter.hasNext()) {
				Map.Entry entry = (Map.Entry) iter.next();
				Object key = entry.getKey();
				Object val = entry.getValue();
				if (((String) val).equals(sessionUserName)) {
					hashUserName.put(key, null);
					iter.remove();
				}
			}
			hashUserName.put(session.getId(), sessionUserName);// 添加现在的sessionID和username
		} else {// 如果该用户没登录过,直接添加现在的sessionID和username
			hashUserName.put(session.getId(), sessionUserName);
		}
	}
}
2、在登陆的controller中加入
<pre name="code" class="java">SessionListener.replaceUserSession(session, user.getUsername());//其中session为HttpSession session = request.getSession(); //user.getUsername()为用户名


 

3、用户退出代码

/**
	 * 退出登录
	 * 
	 * @param request
	 * @return
	 */
	@RequestMapping("/exit.htm")
	public @ResponseBody
	Boolean exit(HttpServletRequest request) {
		HttpSession session = request.getSession();
		session.invalidate();
		return true;
	}
4、验证用户是否登录或在在线

/**
	 * 设置15分钟重新登录
	 */
	@RequestMapping(value = "/fifteenLogout.json")
	public @ResponseBody
	String fifteenLogout(HttpServletRequest request) {
		Map<String, String> map = new HashMap<String, String>();
		Gson gson = new Gson();
		HttpSession session = request.getSession();
		boolean isLogin = SessionListener.isOnline(session);
		if (session.getAttribute("username") == null || session.getAttribute("username") == "" || isLogin == false) {
			map.put("message", "您已在其它地方登录或者在15分钟以内没有操作,请重新登录!!!");
		}
		return gson.toJson(map);
	}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值