关注性能小课,成长不止一点点
上篇文章我们讲到登录认证接口基本实现,但是会遇到一个问题,不同浏览器可能会登录同一个账号,且不会踢除的情况,今天我们来说说怎样来解决这问题。
▎框架
springboot + vue
▎MySessionContext.java类定义
先定义一个MySessionContext.java, 该类中有个 Map对象,用于存储所有用户登录后的 username和session值,只要登录成功了,就往里边存入值,再次登录会通过有没有值判断是否登录过。
package com.aitest.platform.config.session;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;
public class MySessionContext {
private static MySessionContext context;
private Map<String, HttpSession> map;
private MySessionContext() {
map = new HashMap<>();
}
public static MySessionContext getSessionContext() {
if(context == null) {
context = new MySessionContext();
}
return context;
}
//添加
public synchronized void addSession(String username,HttpSession session) {
if(session!= null) {
map.put(username, session);
}
}
//获取
public synchronized HttpSession getSession(String username) {
if(username == null) {
return null;
}
return map.get(username);
}
//删除
public synchronized void delSession(String username,HttpSession session) {
if(session!= null) {
map.remove(username);
}
}
//获取map的个数
public synchronized String getSize() {
int size = map.size();
return String.valueOf(size);
}
}
▎登录接口重新修改
从登录接口可以看出,先去数据库拿用户信息,判断用户是否存在,存在后,再去上面MySessionContext 类中看看是否有数据,有就是表示登录过,就会把老的session中属性名给移除,移除了就表示他未登录了,然后拿新的seesion给他设置属性即可。这样就能达到踢除之前登录效果了。
@Autowired
private UserService userService;
/**
* 登录方法 给session上绑定LOGIN_NAME属性判断是否登录,所有session保存到MySessionContext里边,通过username去取到老的session
*/
@RequestMapping("/login")
public ResultBean<Object> login(HttpServletRequest request, HttpSession session, String username, String password) {
ServletContext application = session.getServletContext();
UserBean bean = userService.userIsExists(username,password);
if(bean != null){
//从MySessionContext中通过LOGIN_NAME 拿老的session
HttpSession oldSession = context.getSession(username);
if(oldSession != null){
oldSession.removeAttribute("LOGIN_NAME");
context.delSession(username,oldSession);
}
session.setAttribute("LOGIN_NAME", username);
session.setMaxInactiveInterval(86400);
context.addSession(username,session);
// 登录成功,则添加Session并存储登录用户名
return ResultBean.success("登录成功!");
}
return ResultBean.failed("登录账号或密码错误!");
}
▎登出接口
登出功能简单,从session中把属性名移除即可。
/**
* 退出登录
* @param session
* @param sessionStatus
* @return
*/
@RequestMapping("/logout")
public ResultBean<Object> logout(HttpSession session, SessionStatus sessionStatus){
//从MySessionContext中通过LOGIN_NAME 拿老的session
HttpSession oldSession = context.getSession(session.getAttribute("LOGIN_NAME")+"");
context.delSession(session.getAttribute("LOGIN_NAME")+"",oldSession);
//再移除实际session
session.removeAttribute("LOGIN_NAME");
return ResultBean.failed("退出登录成功!");
}
END
欢迎加入我们:
扫码加入公开课学习交流群②
已在公开课学习交流群①
的小朋友请勿重复加群

免费技术支持微信:15712862196
咨询QQ:2657535456
咨询微信号:huice666

慧测公众号


