Java 将信息从拦截器传递到控制器方法

Java 将信息从拦截器传递到控制器方法,java,playframework,controller,interceptor,playframework-2.3,Java,Playframework,Controller,Interceptor,Playframework 2.3,我正在使用Play2.3(Java)。 我在Global.java文件中有一个onRequest方法。 下面是关于Stackoverflow和其他资源的一些答案,我的Global.java类似于- private static ArrayList<String> admin_users = new ArrayList<String>(); public static ArrayList<String> getAdmin_users() { r

我正在使用Play2.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);
}
private static ArrayList admin_users=new ArrayList();
公共静态ArrayList getAdmin_users(){
返回管理员用户;
}
公共静态void setAdmin_用户(ArrayList admin_用户){
Global.admin\u users=管理员用户;
}
@凌驾
public void onStart(play.Application arg0){
ArrayList admins=新建ArrayList();
添加(“aahuja”);
添加(“chlr”);
添加管理员(“bobba”);
setAdmin_用户(管理员);
}
private static ArrayList admin_users=new ArrayList();
公共静态ArrayList getAdmin_users(){
返回管理员用户;
}
公共静态void setAdmin_用户(ArrayList admin_用户){
Global.admin\u users=管理员用户;
}
@凌驾
public void onStart(play.Application arg0){
ArrayList admins=新建ArrayList();
添加(“aahuja”);
添加(“chlr”);
添加管理员(“bobba”);
setAdmin_用户(管理员);
}
私有类ActionWrapper扩展了Action.Simple{
私有字符串用户;
公共ActionWrapper(操作,字符串用户){
这个代表=行动;
this.user=用户;
}
@凌驾
公共承诺调用(Http.Context ctx)抛出java.lang.Throwable{
承诺结果=this.delegate.call(ctx);
ctx.args.put(“Name”,this.user);
}
@凌驾
公共操作onRequest(Http.Request-Request,java.lang.reflect.Method-actionMethod){
if(request.getHeader(“OriginalName”)!=null){
if(getAdmin_users().contains(request.getHeader(“OriginalName”)){
if(request.hashreader(“模拟”)&&request.getHeader(“模拟”).equals(“true”)){
返回新的ActionWrapper(super.onRequest(request,actionMethod),request.getHeader(“IMPERSONATE-IDENTITY”);
}
}
返回新的ActionWrapper(super.onRequest(request,actionMethod),request.getHeader(“OriginalName”);
}
其他的
返回super.onRequest(request,actionMethod);
}
现在,在我的控制器文件中,我有这样一个方法-

public static Promise<Result> all() {

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

        // rest of code         
    }
publicstaticpromise all(){
字符串名称=(字符串)ctx().args.get(“名称”);
System.out.println(名称);
//代码的其余部分
}
现在,当我向这个应用程序传递一个请求时,其标题信息如下-
OriginalName:abcd
,我在控制器内部打印出一个值
null

ctx
是传递数据的正确方法吗?如果不是,正确的方法是什么。 我试图从主业务逻辑中去掉冗余逻辑


如果我们能够在头信息从拦截器传递到控制器时修改头信息,也可以实现同样的效果。但我找不到任何合适的方法。在调用委托之前,请尝试放置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);
    }
@覆盖
公共承诺调用(Http.Context ctx)抛出java.lang.Throwable{
ctx.args.put(“Name”,this.user);
承诺结果=this.delegate.call(ctx);
}

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

您应该粘贴您的删除代码。我认为您缺少一些重要信息。在调用代理之前,请尝试放置
ctx.args.put()
。@bjoernhaeuser谢谢,放置
ctx.args.put()
在工作之前。您能解释一下为什么会发生这种情况吗?我有没有办法修改标题以便拦截器更改它们?