保证用户唯一登录的思路
博客专区 > mifans 的博客 > 博客详情
保证用户唯一登录的思路
mifans 发表于10个月前
保证用户唯一登录的思路
  • 发表于 10个月前
  • 阅读 132
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

现在做的一块app 查药专家,需要限制用户唯一登陆,参考了网上的代码,简单实现了一下

实现HttpSessionAttributeListener ,监听addAtrribute事件

package com.kbs.platform.filter;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

import com.kbs.platform.base.MySessionContext;
import com.kbs.platform.vo.LoginedUser;
/**
 * 监听属性新增事件
 * @author kbs
 *
 */
public class SoleLoginListener implements HttpSessionAttributeListener {
	
	@Override
	public void attributeAdded(HttpSessionBindingEvent se) {
		 String name=se.getName();
		 if (name.equals("userInfo")) {
			 LoginedUser loginedUser=(LoginedUser) se.getValue();
			 if (MySessionContext.getUserInfo(loginedUser.getUserId())!=null) {
				//String oldSession= 
			//	MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).removeAttribute("userInfo");
				//MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).removeAttribute("userID");
				//MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).removeAttribute("user");
				MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())).invalidate();
				MySessionContext.DelSession(MySessionContext.getSession(MySessionContext.getUserInfo(loginedUser.getUserId())));
			}
			 MySessionContext.addUserInfo(loginedUser.getUserId(), loginedUser.getSessionId());
		 }

	}

	@Override
	public void attributeRemoved(HttpSessionBindingEvent se) {
		 String name=se.getName();
		 if (name.equals("userInfo")) {
			 LoginedUser loginedUser=(LoginedUser) se.getValue();
			 MySessionContext.removeUserInfo(loginedUser.getUserId());
		 }
		
	}

	@Override
	public void attributeReplaced(HttpSessionBindingEvent se) {
		// TODO Auto-generated method stub
		
	}

	

}

简单的保存信息的上下文

package com.kbs.platform.base;

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

import javax.servlet.http.HttpSession;

public class MySessionContext {
    private static Map<String, HttpSession> mymap = new HashMap<>();
    private static Map<Integer,String> loginedUser=new HashMap<>();
    public static synchronized void AddSession(HttpSession session) {
        if (session != null) {
            mymap.put(session.getId(), session);
        }
    }

    public static synchronized void DelSession(HttpSession session) {
        if (session != null) {
            mymap.remove(session.getId());
        }
    }

    public static synchronized HttpSession getSession(String session_id) {
        if (session_id == null)
        return null;
        return (HttpSession) mymap.get(session_id);
    }
    public static synchronized String getUserInfo(Integer userId){
    	if (userId==null) {
			return null;
		}
    	return  loginedUser.get(userId);
    };
    public static synchronized void addUserInfo(Integer userId,String sessionId){
    	loginedUser.put(userId, sessionId);
    }
    public static synchronized void removeUserInfo(Integer userId){
    	if (userId!=null) {
    		loginedUser.remove(userId);
		}
    }
  
}

web.xml配置

<listener>
	 <listener-class>
	      com.kbs.platform.filter.SoleLoginListener
	</listener-class>
	</listener>

基本可以实现.

包括上一篇的登录状态的保持,其实都可以在redis中实现.思路基本差不多

共有 人打赏支持
粉丝 10
博文 202
码字总数 102200
×
mifans
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: