NutzCN Logo
问答 Shiro+redis做session共享得问题
发布于 2402天前 作者 quinnxiao 2454 次浏览 复制 上一个帖子 下一个帖子
标签:

我用shiro+redis做session共享,用户登陆后重启服务器无法获取ServletContext中得值
用户登陆后将用户得sessionID与用户绑定

private void saveLoginSession(String username){
        ServletContext application = Mvcs.getHttpSession().getServletContext();
        Map<String, String> loginUsers = (Map<String, String>) application
                .getAttribute("loginUsers");

        String sessionId = Mvcs.getHttpSession().getId();
        log.debug("sessionId=============:" + sessionId);
        log.debug("loginUsers:" + loginUsers);
        if (loginUsers == null || loginUsers.size() == 0) {
            loginUsers = new HashMap<>(10);
            loginUsers.put(username, sessionId);
            application.setAttribute("loginUsers", loginUsers);
        } else {
            loginUsers.put(username, sessionId);
        }
    }

再重启服务器后判断用户登陆无法获取ServletContext中设置得loginUsers,但是可以获取Attribute(Auth.FRONT_KEY)这个设置得值

public static Boolean isLogin() {
        HttpSession session = Mvcs.getHttpSession();
        ServletContext application = session.getServletContext();
        if (application == null) {
            return false;
        }
        Map<String, String> loginUsers = (Map<String, String>) application.getAttribute("loginUsers");
        if (loginUsers == null || loginUsers.size() == 0) {
            return false;
        }
        String sessionId = session.getId();
        Auth auth = (Auth) session.getAttribute(Auth.FRONT_KEY);
        if (auth == null) {
            return false;
        }
        String userSessionId = loginUsers.get(auth.name);
        if (userSessionId != null && !sessionId.equals(userSessionId)) {
            session.removeAttribute(Auth.FRONT_KEY);
            return false;
        }
        return true;
    }
9 回复

哪有放servletContext的?!

ServletContext application = Mvcs.getHttpSession().getServletContext();
        Map<String, String> loginUsers = (Map<String, String>) application
                .getAttribute("loginUsers");
HttpSession session = Mvcs.getHttpSession();
        ServletContext application = session.getServletContext();
        if (application == null) {
            return false;
        }
        Map<String, String> loginUsers = (Map<String, String>) application.getAttribute("loginUsers");

这两个地方呀

ServletContext重启进程就是新的,不会持久化的

那这种需要怎么做呢,我要防止多处登陆,新登陆的将之前登陆的踢下线

user类加个session id字段咯

好吧,有没有别的方式,这种加重数据库的负担啊

redis也行咯,总得把这个关系持久化

好滴,谢谢

@wendal 定义的这个HttpSessionListener监听器对session过期还起作用吗

添加回复
请先登陆
回到顶部