3

Play 2.3 (Java)을 사용 중입니다. Global.java 파일에 onRequest 메서드가 있습니다. 내가 요청을 통과 할 때 지금인터셉터에서 컨트롤러 방법으로 정보 전달

public static Promise<Result> all() { 

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

     // rest of code   
    } 

- 내 컨트롤러 파일 내부에, 나는이 같은 방법을 가지고,

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); 
} 

지금 - 에 유래 및 기타 리소스에 대한 몇 가지 답변에 따라, 내 Global.java 같은입니다 - OriginalName: abcd과 같은 헤더 정보가있는이 응용 프로그램은 내 컨트롤러에 null 값을 표시합니다.

ctx 올바른 데이터 전달 방법은 무엇입니까? 올바른 방법이 아니라면. 주요 비즈니스 로직에서 여분의 로직을 제거하려고합니다.

인터셉터에서 컨트롤러로 전달 될 때 헤더 정보를 수정할 수있는 경우에도 마찬가지입니다. 그러나 그렇게 할 수있는 적절한 방법은 없습니다.

+1

당신은 당신의 comlete 코드를 붙여야합니다. 나는 당신이 여기 중요한 정보 제언을 놓치고 있다고 생각합니다. 또한 델리게이트를 호출하기 전에'ctx.args.put()'을 넣으십시오. – bjoernhaeuser

+0

@bjoernhaeuser 고맙습니다. 근무하기 전에'ctx.args.put()'을 사용했습니다. 왜 이런 일이 일어 났는지 설명 할 수 있니? – hyades

답변

1

대리자를 호출하기 전에()을 ctx.args.put을 넣어보십시오 : 당신은 당신의 작업을 실행 afther 값을 설정하는

@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); 
    } 

. 그래서 당신은 당신의 행동 내부의 가치에 접근 할 수 없습니다.

+0

헤더가 인터셉터에 의해 변경되도록 헤더를 수정할 수있는 방법이 있습니까? – hyades