大数跨境

服务端登录认证接口实现(二)

服务端登录认证接口实现(二) 慧测
2021-07-15
2
导读:关注性能小课,成长不止一点点01 前言 上篇文章我们讲到登录认证接口基本实现,但是会遇到一个问题,不同


关注性能小课,成长不止一点点






01
  前言   


上篇文章我们讲到登录认证接口基本实现,但是会遇到一个问题,不同浏览器可能会登录同一个账号,且不会踢除的情况,今天我们来说说怎样来解决这问题。


▎框架

springboot + vue



02
  实现   


▎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


慧测公众号








【声明】内容源于网络
0
0
慧测
专注人工智能前沿技术落地企业实战应用
内容 404
粉丝 0
慧测 专注人工智能前沿技术落地企业实战应用
总阅读104
粉丝0
内容404