1、建一个session监听类
public class MySessionListener implements HttpSessionListener {
public static HashMap sessionMap=new HashMap();
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
// TODO Auto-generated method stub
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
// TODO Auto-generated method stub
HttpSession httpSession = httpSessionEvent.getSession();
Student student = (Student) httpSession.getAttribute("student");
HttpSession session=httpSessionEvent.getSession();
DelSession(session);
}
public static synchronized void DelSession(HttpSession session) {
if (session != null) {
// 删除单一登录中记录的变量
if(session.getAttribute("student")!=null){
Student tu =(Student)session.getAttribute("student");
MySessionListener.sessionMap.remove(tu.getNumber());
}
}
}
}
2.在用户 登录方法 中调用
number是登陆方法获取前端请求的数据(学生登陆的账号)
if (null!=MySessionListener.sessionMap.get(number)){
System.out.println("此账号已登录!");
forceLogoutUser(number);
MySessionListener.sessionMap.put(number,getSession());
}else {
System.out.println("此账号未登录!");
MySessionListener.sessionMap.put(number,getSession());
}
3.删除用户在map中存的数据
public static void forceLogoutUser(String uid) {
// 删除单一登录中记录的变量
if (MySessionListener.sessionMap.get(uid) != null) {
HttpSession hs = (HttpSession) MySessionListener.sessionMap.get(uid);
MySessionListener.sessionMap.remove(uid);
Enumeration e = hs.getAttributeNames();
while (e.hasMoreElements()) {
String sessionName = (String) e.nextElement();
// 清空session
hs.removeAttribute(sessionName);
}
// hs.invalidate();
}
}
4.判断此账号是否已登录
//前端ajax请求代码,会给后一个登陆者进行提示
$.ajax({
type: "POST",
url: "/student/checkLogin?username=" + username,
dataType: "JSON",
async: false,
success: function (data) {
if (data.code == 1) {
var flag = confirm("此账号已登录!是否继续登录?")
if (flag == false) {
//alert("继续登录成功!")
return;
}
}
}
})
//后端java代码,此框架为jfinal
public void checkLogin(){
String number=getPara("username");//此为jfinal框架的获取前端数据方式
ObjectVo objectVo=new ObjectVo();//自定义的bean
if (null!=MySessionListener.sessionMap.get(number)){
System.out.println("此账号已登录!");
objectVo.setCode(1);
}else {
objectVo.setCode(0);
}
renderJson(objectVo);
}
//ObjectVo
public class ObjectVo {
private Integer code;
private String msg;
private Object object;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
}
给被挤掉的用户进行提示
此方法隔十秒进行一次请求,感觉此方式不太好,如果您有好的解决方法,麻烦请告知一下,谢谢
$(function () {
setInterval(function () {
$.ajax({
type: "post",
url: "/student/checkIsLogout",
dataType: "JSON",
success: function(response){
if(response.code == 0){
alert("您的账号已在其他地方登录,您被迫下线。")
window.location.href="/student/login"
}
}
})
},10000)
})
/**
* 检测账号是否被挤掉
*/
public void checkIsLogout(){
ObjectVo objectVo=new ObjectVo();
if(getSession()!=null){
Object student = getSessionAttr("student");
if (student==null){
System.out.println("session信息不存在,登录失效");
objectVo.setCode(0);
}
}else{
System.out.println("session信息不存在,登录失效");
objectVo.setCode(0);
}
renderJson(objectVo);
return;
}
参考:https://blog.csdn.net/hk9024/article/details/51836824