1.解决方案
重写实体类的hashcode()方法和equals方法,参考如下:
public class SysUsers implements UserDetails {
private String userName;
//.......省略属性信息、setter、getter方法以及实现的方法
@Override
public int hashCode() {
return this.userName.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj instanceof SysUsers && Objects.equals(this.userName, ((SysUsers) obj).userName);
}
}
2.原因分析
上图中principals属性是一个concurrentMap,但是它使用用户实体作为key。
但是在hashMap中,以对象为作为key,必须重写hashcode和equals两个方法。
这导致一个用户每次登录注销时计算得到的key都不相同,在这种情况下,不但达不到会话并发控制的效果,还会引发内存泄漏。