我有两个用户:A和B,如果用户A首先登录,则用户B无法登录util用户A注销。每个用户都需要三个登录信息:storeId,storePassword,userPassword。
如果用户B与用户A的storeId相同,则不允许登录
如果用户B与用户A的storeId不同,则允许登录
我使用ServletContext来保存已记录的用户,当记录用户单击注销时,我将从ServletContext中删除该用户。但是,当用户关闭浏览器点击注销时,我无法处理。我认为这不是一个好主意
这是我的代码
@Override
public void onLogoutSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
//redirectStrategy.sendRedirect(request, response, "/login");
// do whatever you want
ServletContext context = request.getSession().getServletContext();
Object _auths = context.getAttribute("_authentications");
if(_auths != null) {
List<String> auths = (List<String>) _auths;
auths.remove(authentication.getName());
if(auths.size() == 0) {
auths = new ArrayList<String>();
}
context.setAttribute("_authentications", auths);
}
super.onLogoutSuccess(request, response, authentication);
}
有人给我一个很好的解决方案吗? 谢谢
答案 0 :(得分:1)
我已经解决了我的问题,我在ServletContext的AuthencationProvide intead中使用SessionRegistry
@Autowired
@Qualifier("sessionRegistry")
private SessionRegistry sessionRegistry;
List<Object> principals = sessionRegistry.getAllPrincipals();
for (Object principal: principals) {
String[] auths = principal.toString().split(StringPool.DASH);
if(auths.length == 4 && auths[1].equals(storeId)) {
throw new BadCredentialsException(auths[0]+StringPool.DASH+auths[1]);
}
}
这段代码在会话超时,用户关闭浏览器时效果很好。而且我不需要任何js源代码来处理
答案 1 :(得分:0)
您可以使用下面的js在窗口关闭时从servletContext中删除用户:
<script type="text/javascript">
window.onbeforeunload = logout;
function logout(){
// Make an ajax call to remove user from ServletContext
alert("Window close is being called");
return false;
}
</script>