【问题标题】:Passing information from interceptor to controller method将信息从拦截器传递到控制器方法
【发布时间】:2015-01-22 07:51:43
【问题描述】:

我正在使用 Play 2.3 (Java)。 我的Global.java 文件中有一个onRequest 方法。 在 Stackoverflow 和其他资源上的一些答案之后,我的 Global.java 就像 -

private static ArrayList<String> admin_users = new ArrayList<String>();

public static ArrayList<String> getAdmin_users() {
        return admin_users;
    }

public static void setAdmin_users(ArrayList<String> admin_users) {
    Global.admin_users = admin_users;
}

@Override
public void onStart(play.Application arg0) {
    ArrayList<String> admins = new ArrayList<String>();
    admins.add("aahuja");
    admins.add("chlr");
    admins.add("bobba");
    setAdmin_users(admins);
}

private static ArrayList<String> admin_users = new ArrayList<String>();

public static ArrayList<String> getAdmin_users() {
    return admin_users;
}

public static void setAdmin_users(ArrayList<String> admin_users) {
    Global.admin_users = admin_users;
}

@Override
public void onStart(play.Application arg0) {
    ArrayList<String> admins = new ArrayList<String>();
    admins.add("aahuja");
    admins.add("chlr");
    admins.add("bobba");
    setAdmin_users(admins);
}
private class ActionWrapper extends Action.Simple {
        private String user;

        public ActionWrapper(Action<?> action, String user) {
            this.delegate = action;
            this.user = user;
        }

        @Override
        public Promise<Result> call(Http.Context ctx) throws java.lang.Throwable {
            Promise<Result> result = this.delegate.call(ctx);
            ctx.args.put("Name", this.user);

}




@Override
public Action<?> onRequest(Http.Request request, java.lang.reflect.Method actionMethod) {

    if(request.getHeader("OriginalName") != null){
        if(getAdmin_users().contains(request.getHeader("OriginalName"))){
            if(request.hasHeader("IMPERSONATE") && request.getHeader("IMPERSONATE").equals("true")){
                return new ActionWrapper(super.onRequest(request, actionMethod), request.getHeader("IMPERSONATE-IDENTITY"));
            }
        }
        return new ActionWrapper(super.onRequest(request, actionMethod), request.getHeader("OriginalName"));
    }
    else
        return super.onRequest(request, actionMethod);
}

现在,在我的控制器文件中,我有一个这样的方法 -

public static Promise<Result> all() {

        String name = (String) ctx().args.get("Name");
        System.out.println(name);

        // rest of code         
    }

现在,当我向该应用程序传递一个请求时,其标题信息如下 - OriginalName: abcd,我在我的控制器中得到了一个值null

ctx 是传递数据的正确方式吗?如果不是什么正确的方法。 我正在尝试从主要业务逻辑中去除冗余逻辑。

如果我们能够在从拦截器传递到控制器时修改标头信息,也可以实现相同的目的。但我找不到任何合适的方法。

【问题讨论】:

  • 您应该粘贴完整的代码。我认为你在这里遗漏了一些重要的信息。也尝试在调用代理之前输入ctx.args.put()
  • @bjoernhaeuser 谢谢,把ctx.args.put() 放在工作之前。你能解释一下为什么会这样吗?

标签: java playframework controller interceptor playframework-2.3


【解决方案1】:

尝试在调用委托之前放置 ctx.args.put():

    @Override
    public Promise<Result> call(Http.Context ctx) throws java.lang.Throwable {
        ctx.args.put("Name", this.user);
        Promise<Result> result = this.delegate.call(ctx);
    }

您在操作运行后设置值。因此,您无法访问操作中的值。

【讨论】:

  • 有没有办法可以修改标题以便拦截器更改它们?
猜你喜欢
  • 2018-06-24
  • 2020-03-15
  • 1970-01-01
  • 2017-03-29
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多