NutzCN Logo
精华 nutz中shiro登录 session存储问题 踢出用户
发布于 2737天前 作者 zjqcy 1995 次浏览 复制 上一个帖子 下一个帖子
标签:

管理员Superadmin 登录 在线 管理员admin也登录在线
superadmin把admin删掉过后 admin还能继续操作 请问一下我要怎么使他及时调到登录页面呢??
初学者 求帮助

18 回复

加个处理器

如果是已登录的session,先查一下用户是否存在,不存在就注销session

请问一下我每次请求都要去数据库查看用户是否存在吗?

@wendal 请问一下我每次请求都要去数据库查看用户是否存在吗?

可以在session里面放个时间戳嘛,超过多少秒就检查一次

@wendal public View match(ActionContext context) {

        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser != null) {
            Sys_user user = (Sys_user) currentUser.getPrincipal();
            if (user != null) {
                context.getRequest().setAttribute("uid",user==null?"":user.getId());
            }
            else {
                return new ServerRedirectView("/private/login");
            }
        } else {
            return new ServerRedirectView("/private/login");
        }
        return null;
    }

}
我这样写的拦截器  不起作用? 哪里有错吗?

@zjqcy 我说的是 处理器,不是拦截器

@wendal 我没用过 可以帮助一下吗?

另外, 你写的拦截器, 在重定向之前, 少了一句

currentUser .logout();

加上之后,应该也可以工作.

@wendal
public View match(ActionContext context) {

    //忽略AJAX请求
    if (!"XMLHttpRequest".equalsIgnoreCase(context.getRequest().getHeader("x-requested-with"))) {
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser != null) {
            Sys_user user = (Sys_user) currentUser.getPrincipal();
            if (user != null) {
                context.getRequest().setAttribute("uid",user==null?"":user.getId());
            }
            else {
                currentUser .logout();
                return new ServerRedirectView("/private/login");
            }
        } else {
            return new ServerRedirectView("/private/login");
        }     
    }   
    return null; 
}
这样还是不对

话说, 这拦截器代码依然不对, 只是从shiro中取出user实例,但没有到数据库去检查该用户是否存在

    //忽略AJAX请求??? 为啥忽略ajax请求??
    if (!"XMLHttpRequest".equalsIgnoreCase(context.getRequest().getHeader("x-requested-with"))) { 
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser != null) {
            Sys_user user = (Sys_user) currentUser.getPrincipal();
            if (user != null) { 
			    // 到数据库查一下用户是否还存在, TODO 在session中存放时间戳,减少查询次数
                if (dao.count(User.class, user.getId()) == 0) {
                     currentUser .logout();
                     return new ServerRedirectView("/private/login");
				}
                context.getRequest().setAttribute("uid",user==null?"":user.getId());
            }
            else {
                currentUser .logout();
                return new ServerRedirectView("/private/login");
            }
        } else {
            return new ServerRedirectView("/private/login");
        }     
    }   
    return null; 
}

@wendal
public class PrivateFilter implements ActionFilter {
private static final Log log = Logs.get();

@Inject
UserService userService;
public View match(ActionContext context) {

    System.out.println("----------------"+userService);
    //忽略AJAX请求
    if (!"XMLHttpRequest".equalsIgnoreCase(context.getRequest().getHeader("x-requested-with"))) { 
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser != null) {
            Sys_user user = (Sys_user) currentUser.getPrincipal();
            if (user != null) { 
                // 到数据库查一下用户是否还存在, TODO 在session中存放时间戳,减少查询次数         
                System.out.println(userService);
                if(userService!=null){
                    if (userService.queryId(user.getId())== 0) {
                        currentUser .logout();
                        return new ServerRedirectView("/private/login");
                   }  
                }

                context.getRequest().setAttribute("uid",user==null?"":user.getId());
            }
            else {
                currentUser .logout();
                return new ServerRedirectView("/private/login");
            }
        } else {
            return new ServerRedirectView("/private/login");
        }     
    }   
    return null; 
}

}
可以直接注入Dao吗?

if (userService == null)
   userService = context.getIoc().get(UserService.class)

@wendal
用户删掉后还是可以操作
拦截器没起作用
弄了一天 蓝瘦 香菇

debug一下啊,看看有无执行logout

@wendal 谢谢 执行到了 只是被删除的用户 没能退到登录页面 只是一直在loading页面 再刷新一下才到了登录页面

@wendal public View match(ActionContext context) {

    //忽略AJAX请求
    /*if (!"XMLHttpRequest".equalsIgnoreCase(context.getRequest().getHeader("x-requested-with"))) { */
    /* } */ 
        Subject currentUser = SecurityUtils.getSubject();
        if (currentUser != null) {
            Sys_user user = (Sys_user) currentUser.getPrincipal();
            if (user != null) { 
                // 到数据库查一下用户是否还存在, TODO 在session中存放时间戳,减少查询次数         
                    userService = context.getIoc().get(UserService.class);
                    if (userService.queryId(user.getId())== 0) {
                        currentUser .logout();
                        return new ServerRedirectView("beetl:/private/sys/login.html");
                   }else{
                       context.getRequest().setAttribute("uid",user==null?"":user.getId());
                   }                            
             }
             else {
                currentUser .logout();
                return new ServerRedirectView("beetl:/private/sys/login.html");
            }
        } else {
            return new ServerRedirectView("beetl:/private/sys/login.html");
        }     

    return null; 
}
我写成这样子就可以了 
添加回复
请先登陆
回到顶部