NutzCN Logo
问答 是因为退出后不能获取容器中的service嘛?
发布于 139天前 作者 qq_0d17d15e 191 次浏览 复制 上一个帖子 下一个帖子
标签:

遇到一点小问题,doOut方法中的userService为null,而logout中的userService不会为null,怎么回事呢?doOut方法是服务器内部直接调用,logout是通过前端页面发送请求触发,是因为这个问题吗?这个问题怎么解决吗?

 public void doOut(String sessionId) {
        try {
            System.err.println("----------准备退出------------------");
            Subject subject = new Subject.Builder().sessionId(sessionId).buildSubject();
            Sys_user user = (Sys_user) subject.getPrincipal();
            subject.logout();
            if (user != null) {
                userService.update(Chain.make("isOnline", false), Cnd.where("id", "=", user.getId()));
                sysOperateLogService.insertOperateLog(StringUtil.getRemoteAddr(), "退出", "成功退出系统", "用户退出系统", "系统操作日志", user.getId(), user.getUsername(), "3e967b028ba44a6c942b396e530df526");
            }
            System.err.println("----------执行了退出2------------------");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 /**
     * 退出系统
     */
    @At("/logout")
    @Ok(">>:/platform/login")
    public void logout() {
        try {
            Subject currentUser = SecurityUtils.getSubject();
            Sys_user user = (Sys_user) currentUser.getPrincipal();
            currentUser.logout();
            //退出后清空cookie

            if (user != null) {
                userService.update(Chain.make("isOnline", false), Cnd.where("id", "=", user.getId()));
                sysOperateLogService.insertOperateLog(StringUtil.getRemoteAddr(), "退出", "成功退出系统", "用户退出系统", "系统操作日志", user.getId(), user.getUsername(), "3e967b028ba44a6c942b396e530df526");
            }
        } catch (SessionException ise) {
            log.debug("Encountered session exception during logout.  This can generally safely be ignored.", ise);
        } catch (Exception e) {
            log.debug("Logout error", e);
        }
    }
@Inject
    private SysUserService userService;
8 回复

doOut是什么类的代码

doOut方法所在的对象是你自己new出来的?

额,两个方法都是在SysLoginController类中,
调用的时候确实是new出来的,直接在filter中注入可以解决?
我先试一下

try {
            HttpServletRequest request= (HttpServletRequest) req;
            StringBuffer url1 = request.getRequestURL();
            String uurl = url1.toString();
            System.err.println(url1);
            //if (uurl.contains("login")){
                SysLoginController loginController = new SysLoginController();
                ArrayList<String> tokenList = SysLoginController.tokenList;
                System.err.println("=====后台检测token====开始检测token=========");
                for (int i = 0; i < tokenList.size(); i++) {
                    String[] tokenAndSid = tokenList.get(i).split(",");
                    if ("AAJTSQACMDIAAlNLABMtNjQwNTQyMzA3ODY4MTYxMzUzAAJTMQACMDEZXSS".equalsIgnoreCase(tokenAndSid[0])) {

                    } else {
                        String url = "http://172.16.64.72:8090/bam/identity/json/attributes?subjectid=" +tokenAndSid[0];
                        URI uri = new URI(url);
                        URL urls = uri.toURL();
                        HttpURLConnection connection = (HttpURLConnection) urls.openConnection();
                        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                        connection.setRequestProperty("Charset", "utf-8");
                        connection.setRequestMethod("GET");
                        connection.connect();
                        int responseCode = connection.getResponseCode();
                        if (responseCode == 401 || responseCode != 200) {
                            //loginController.logout();
                            /*在退出之前,先放行,防止退出后回调时发生session丢失*/
                            chain.doFilter(req, resp);
                            loginController.doOut(tokenAndSid[1]);
                            tokenList.remove(i);
                        }
                    }
                }
            //}
            chain.doFilter(req, resp);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

直接new的对象,是没有ioc注入一说的

那么如果在filter中注入SysLoginController好像不可行,方法没有被调用,刚刚试了一下,如果像这样直接new出来使用的,怎么解决userService报null的情况

@wendal 兽总,如何手动的去获取service呢?@Filters(@By(type=XX.class,args="ioc:xxxXX")),这个我有点不太会用

@wendal 他用的这个看起来像nutzwk,实则是自己改的面目全非的版本,如果有问题你别说去nutzwk提交issues哦……跑路

来自 iPhone 6

ActionContext有getIoc方法

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