项目中的多重登录检测处理

需求:

一个账户同时只能一次登录在线,当使用同一个账户二次登录的时候那么第一的登录将被失效(类似QQ挤下线)

处理基本思想:

将唯一用户ID与Session建立关联关系放在Application作用域中进行管理。

----------------------------------------------------------------------------------------------------------

关键处理类:

  1. package com.defshare.sy.web.util;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Properties;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.http.HttpSession;
  7. import org.apache.log4j.Logger;
  8. import org.apache.struts2.ServletActionContext;
  9. import com.defshare.foundation.global.PropertiesUtil;
  10. import com.defshare.sy.config.AuthConfig;
  11. public final class AuthenUtil {
  12. static Logger LOG = Logger.getLogger(AuthenUtil.class);
  13. /**
  14. * 多重登录检测处理
  15. * @param loginId
  16. */
  17. public synchronized static final void multipleLoginDetect(String loginId){
  18. ServletContext servletContext = ServletActionContext.getServletContext();
  19. Map<String,HttpSession> sessionMap = new HashMap<String,HttpSession>();
  20. Object sessionMapObj = servletContext.getAttribute("LOGINED_USER_SESSION_MAP");
  21. if (sessionMapObj!=null){
  22. sessionMap = (Map<String,HttpSession>)sessionMapObj;
  23. }
  24. if (sessionMap.containsKey(loginId.toUpperCase())){//如果登过录就销毁以前登录的Session
  25. HttpSession session = sessionMap.get(loginId.toUpperCase());
  26. if (session!=null && !ServletActionContext.getRequest().getSession().getId().equals(session.getId())){
  27. try {
  28. session.invalidate();
  29. } catch (Exception e) {
  30. LOG.info("session被重复销毁:["+e.getMessage()+"]");
  31. }
  32. }
  33. }
  34. sessionMap.put(loginId.toUpperCase(), ServletActionContext.getRequest().getSession());//将当前session重新放入Map
  35. servletContext.setAttribute("LOGINED_USER_SESSION_MAP", sessionMap);
  36. }
  37. /**
  38. * 登出
  39. * @param loginId
  40. */
  41. public synchronized static final void logout(String loginId){
  42. if(loginId==null || "".equals(loginId))
  43. return;
  44. ServletContext servletContext = ServletActionContext.getServletContext();
  45. Object sessionMapObj = servletContext.getAttribute("LOGINED_USER_SESSION_MAP");
  46. if (sessionMapObj==null){
  47. return;
  48. }
  49. Map<String,HttpSession> sessionMap = (Map<String,HttpSession>)sessionMapObj;
  50. if (sessionMap.containsKey(loginId.toUpperCase())){//如果登过录就销毁以前登录的Session
  51. HttpSession session = sessionMap.get(loginId.toUpperCase());
  52. if (session!=null){
  53. try {
  54. session.invalidate();
  55. LOG.info("根据登录ID:"+loginId+"找到Session,执行销毁");
  56. } catch (Exception e) {
  57. LOG.info("session被重复销毁:["+e.getMessage()+"]");
  58. }
  59. }
  60. sessionMap.remove(loginId.toUpperCase());
  61. }
  62. }
  63. public synchronized static final String getAdminName(){
  64. return AuthConfig.adminName;
  65. }
  66. /**
  67. * 获得管理员信息
  68. * <p>
  69. * admin,0000
  70. * </p>
  71. * @return
  72. */
  73. public synchronized static final String getAdminInfo(){
  74. return AuthConfig.adminName+","+AuthConfig.adminPwd;
  75. }
  76. }
package com.defshare.sy.web.util;

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

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.defshare.foundation.global.PropertiesUtil;
import com.defshare.sy.config.AuthConfig;

public final class AuthenUtil {
	
	static Logger LOG = Logger.getLogger(AuthenUtil.class);
	
	/**
	 * 多重登录检测处理
	 * @param loginId
	 */	
	 public  synchronized static final void multipleLoginDetect(String loginId){
		ServletContext servletContext = ServletActionContext.getServletContext();
		Map<String,HttpSession> sessionMap = new HashMap<String,HttpSession>();
		Object  sessionMapObj = servletContext.getAttribute("LOGINED_USER_SESSION_MAP");
		if (sessionMapObj!=null){
			sessionMap = (Map<String,HttpSession>)sessionMapObj;
		}
		if (sessionMap.containsKey(loginId.toUpperCase())){//如果登过录就销毁以前登录的Session
			HttpSession session = sessionMap.get(loginId.toUpperCase());
			if (session!=null && !ServletActionContext.getRequest().getSession().getId().equals(session.getId())){
				try {
					session.invalidate();
				} catch (Exception e) {
					LOG.info("session被重复销毁:["+e.getMessage()+"]");
				}
			}
				
		}
		sessionMap.put(loginId.toUpperCase(), ServletActionContext.getRequest().getSession());//将当前session重新放入Map
		servletContext.setAttribute("LOGINED_USER_SESSION_MAP", sessionMap);
	}
	 
	/**
	 * 登出
	 * @param loginId
	 */
	public synchronized static final void logout(String loginId){
		if(loginId==null || "".equals(loginId))
			return;
		
		ServletContext servletContext = ServletActionContext.getServletContext();
		
		Object  sessionMapObj = servletContext.getAttribute("LOGINED_USER_SESSION_MAP");
		if (sessionMapObj==null){
			return;
		}
		Map<String,HttpSession> sessionMap = (Map<String,HttpSession>)sessionMapObj;
		if (sessionMap.containsKey(loginId.toUpperCase())){//如果登过录就销毁以前登录的Session
			HttpSession session = sessionMap.get(loginId.toUpperCase());
			if (session!=null){
				try {
					session.invalidate();		
					LOG.info("根据登录ID:"+loginId+"找到Session,执行销毁");
				} catch (Exception e) {
					LOG.info("session被重复销毁:["+e.getMessage()+"]");
				}
			}
				
			sessionMap.remove(loginId.toUpperCase());
		}
	}
	 
	 public synchronized static final String getAdminName(){
		return AuthConfig.adminName;
	 }
	 
	/**
	 * 获得管理员信息
	 * <p>
	 * 	admin,0000
	 * </p>
	 * @return
	 */
	public synchronized static final String getAdminInfo(){		
		return AuthConfig.adminName+","+AuthConfig.adminPwd;
	}
}


登录调用示范:

  1. /**
  2. * 诊所登录
  3. *
  4. * @return
  5. */
  6. public String doLogin() {
  7. SystemLog log = new SystemLog();
  8. String zsid = super.getParam("zsid").toString();
  9. String zsmm = super.getParam("zsmm").toString();
  10. log.setLoginId(zsid);
  11. log.setKind("1");
  12. log.setIp(request.getRemoteHost());
  13. if (StringUtils.isBlank(zsid) || StringUtils.isBlank(zsmm)) {
  14. super.addValidateMsg(VALIDATE_MSG, "诊所编号密码不能为空");
  15. log.setContent("诊所登录失败:[诊所编号密码不能为空]");
  16. systemLogService.addLog(log);
  17. return "toLogin";
  18. }
  19. if (zsid.equals(AuthConfig.adminName)) {
  20. super.addValidateMsg(VALIDATE_MSG, "非法的诊所ID");
  21. log.setContent("诊所登录失败:[非法的诊所ID]");
  22. systemLogService.addLog(log);
  23. return "toLogin";
  24. }
  25. try {
  26. if (cliniqueService.authentication(zsid, zsmm)) {
  27. super.addAttr(IAction.LOGINED_USER, zsid, VScope.SESSION);
  28. UserUtil.setLoginedUser(zsid);// 保存线程局部变量
  29. <SPAN style="COLOR: #ff0000"><STRONG>AuthenUtil.multipleLoginDetect(zsid);</STRONG>
  30. </SPAN> log.setContent("诊所" + zsid + ">登录>成功!");
  31. systemLogService.addLog(log);
  32. return "login_success";
  33. }
  34. } catch (Exception e) {
  35. super.addValidateMsg(VALIDATE_MSG, e.getMessage());
  36. log.setContent("诊所登录异常:[" + e.getMessage() + "]");
  37. systemLogService.addLog(log);
  38. return "toLogin";
  39. }
  40. super.addAttr(IAction.LOGIN_MSG, "用户名密码不正确", VScope.REQ);
  41. log.setContent("诊所登录失败:[用户名密码不正确]");
  42. systemLogService.addLog(log);
  43. return "toLogin";
  44. }
/**
	 * 诊所登录
	 * 
	 * @return
	 */
	public String doLogin() {

		SystemLog log = new SystemLog();

		String zsid = super.getParam("zsid").toString();
		String zsmm = super.getParam("zsmm").toString();

		log.setLoginId(zsid);
		log.setKind("1");
		log.setIp(request.getRemoteHost());

		if (StringUtils.isBlank(zsid) || StringUtils.isBlank(zsmm)) {
			super.addValidateMsg(VALIDATE_MSG, "诊所编号密码不能为空");
			log.setContent("诊所登录失败:[诊所编号密码不能为空]");
			systemLogService.addLog(log);
			return "toLogin";
		}

		if (zsid.equals(AuthConfig.adminName)) {
			super.addValidateMsg(VALIDATE_MSG, "非法的诊所ID");
			log.setContent("诊所登录失败:[非法的诊所ID]");
			systemLogService.addLog(log);
			return "toLogin";
		}

		try {
			if (cliniqueService.authentication(zsid, zsmm)) {
				super.addAttr(IAction.LOGINED_USER, zsid, VScope.SESSION);
				UserUtil.setLoginedUser(zsid);// 保存线程局部变量
				AuthenUtil.multipleLoginDetect(zsid);
				log.setContent("诊所" + zsid + ">登录>成功!");
				systemLogService.addLog(log);
				return "login_success";
			}

		} catch (Exception e) {
			super.addValidateMsg(VALIDATE_MSG, e.getMessage());
			log.setContent("诊所登录异常:[" + e.getMessage() + "]");
			systemLogService.addLog(log);
			return "toLogin";
		}
		super.addAttr(IAction.LOGIN_MSG, "用户名密码不正确", VScope.REQ);
		log.setContent("诊所登录失败:[用户名密码不正确]");
		systemLogService.addLog(log);
		return "toLogin";
	}


登出调用示范:

  1. public String logout() {
  2. if(!StringUtils.isBlank(getCurrentUser())){
  3. SystemLog log = new SystemLog();
  4. log.setLoginId(getCurrentUser());
  5. log.setKind("1");
  6. log.setIp(request.getRemoteHost());
  7. log.setContent("诊所" + getCurrentUser() + ">注销>成功!");
  8. AuthenUtil.logout(getCurrentUser());
  9. systemLogService.addLog(log);
  10. return "logout_success";
  11. }else{
  12. return "logout_success";
  13. }
  14. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值