2014-03-03 38 views
13

我有實現跨域在Java中播放的2.2.x的麻煩啓用Java的遊戲框架的2.2.x CORS

在Java中,將其置於Global.java

public class Global extends GlobalSettings { 

    private class ActionWrapper extends Action.Simple { 
    public ActionWrapper(Action action) { 
    this.delegate = action; 
    } 

    @Override 
    public Result call(Http.Context ctx) throws java.lang.Throwable { 
     Result result = this.delegate.call(ctx); 
     Http.Response response = ctx.response(); 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     return result; 
    } 
    } 

    @Override 
    public Action onRequest(Http.Request request, java.lang.reflect.Method actionMethod) { 
    return new ActionWrapper(super.onRequest(request, actionMethod)); 
    } 

} 
播放2.1.3此代碼的工作

但是,當我試圖編譯java的發揮2.2.x的,它不會再編譯。

編譯錯誤消息:

Global.ActionWrapper不是抽象的,不覆蓋行動抽象方法調用(上下文)...

有沒有爲Java遊戲2.2.x的任何等效代碼?

謝謝。

回答

7

它看起來像這樣:

import play.GlobalSettings; 
import play.libs.F.Promise; 
import play.mvc.Action; 
import play.mvc.Http; 
import play.mvc.SimpleResult; 

public class Global extends GlobalSettings { 
    private class ActionWrapper extends Action.Simple { 
     public ActionWrapper(Action<?> action) { 
      this.delegate = action; 
     } 

     @Override 
     public Promise<SimpleResult> call(Http.Context ctx) throws java.lang.Throwable { 
      Promise<SimpleResult> result = this.delegate.call(ctx); 
      Http.Response response = ctx.response(); 
      response.setHeader("Access-Control-Allow-Origin", "*"); 
      return result; 
     } 
    } 

    @Override 
    public Action<?> onRequest(Http.Request request, java.lang.reflect.Method actionMethod) { 
     return new ActionWrapper(super.onRequest(request, actionMethod)); 
    } 
} 
+0

謝謝!有用! – hrusli

+0

我們使用這種方法,並與導致錯誤的請求的問題。我們稍微更改了代碼,以便在調用委託之前設置響應標頭。 – dknaus

6

對於使用2.3.1+(截至記者發稿)遊戲的人來說,這是現在Promise<Result>而不是Promise<SimpleResult>

import play.GlobalSettings; 
import play.libs.F.Promise; 
import play.mvc.Action; 
import play.mvc.Http; 
import play.mvc.Result; 

public class Global extends GlobalSettings { 
    private class ActionWrapper extends Action.Simple { 
     public ActionWrapper(Action<?> action) { 
      this.delegate = action; 
     } 

     @Override 
     public Promise<Result> call(Http.Context ctx) throws java.lang.Throwable { 
      Promise<Result> result = this.delegate.call(ctx); 
      Http.Response response = ctx.response(); 
      response.setHeader("Access-Control-Allow-Origin", "*"); 
      return result; 
     } 
    } 

    @Override 
    public Action<?> onRequest(Http.Request request, java.lang.reflect.Method actionMethod) { 
     return new ActionWrapper(super.onRequest(request, actionMethod)); 
    } 
} 
1

另一種選擇可能會使用Filters。目前只有Scala過濾器可用。然而,正如this post指出了簡單地修改響應頭,你可以複製粘貼&以下,使CORS着想。

package filters 

import play.api.mvc._ 
import play.mvc.Http.HeaderNames 
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

class EnableCORS extends Filter { 
    def apply(f: (RequestHeader) => Future[Result])(rh: RequestHeader): Future[Result] = { 
    val result = f(rh) 
    result.map(_.withHeaders(HeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN -> "*")) 
    } 
} 

,然後在Global.java添加過濾器只是如此:

@Override 
public <T extends EssentialFilter> Class<T>[] filters() { 
    return new Class[] {EnableCORS.class}; 
} 
2

通過@alexhanschke提出的解決方案,因爲過濾器是不是沒有當請求拋出異常(內部服務器錯誤)工作,在發生這種情況時應用(請參閱https://github.com/playframework/playframework/issues/2429)。爲了解決這個你得換一階類並返回結果,如全圖所示。請注意,這仍然需要指定選項路由和控制器來處理選項請求。

看到這裏https://gist.github.com/tinusn/38c4c110f7cd1e1ec63f整個事情。

import static play.core.j.JavaResults.BadRequest; 
import static play.core.j.JavaResults.InternalServerError; 
import static play.core.j.JavaResults.NotFound; 

import java.util.ArrayList; 
import java.util.List; 

import play.GlobalSettings; 
import play.api.mvc.Results.Status; 
import play.libs.F.Promise; 
import play.libs.Scala; 
import play.mvc.Action; 
import play.mvc.Http; 
import play.mvc.Result; 
import scala.Tuple2; 
import scala.collection.Seq; 

public class Global extends GlobalSettings { 

    private class ActionWrapper extends Action.Simple { 
    public ActionWrapper(Action<?> action) { 
     this.delegate = action; 
    } 

    @Override 
    public Promise<Result> call(Http.Context ctx) throws java.lang.Throwable { 
     Promise<Result> result = this.delegate.call(ctx); 
     Http.Response response = ctx.response(); 
     response.setHeader("Access-Control-Allow-Origin", "*"); 
     return result; 
    } 
    } 

    /* 
    * Adds the required CORS header "Access-Control-Allow-Origin" to successfull requests 
    */ 
    @Override 
    public Action<?> onRequest(Http.Request request, java.lang.reflect.Method actionMethod) { 
    return new ActionWrapper(super.onRequest(request, actionMethod)); 
    } 

    private static class CORSResult implements Result { 
    final private play.api.mvc.Result wrappedResult; 

    public CORSResult(Status status) { 
     List<Tuple2<String, String>> list = new ArrayList<Tuple2<String, String>>(); 
     Tuple2<String, String> t = new Tuple2<String, String>("Access-Control-Allow-Origin","*"); 
     list.add(t); 
     Seq<Tuple2<String, String>> seq = Scala.toSeq(list); 
     wrappedResult = status.withHeaders(seq); 
    } 

    public play.api.mvc.Result toScala() { 
     return this.wrappedResult; 
    } 
    } 

    /* 
    * Adds the required CORS header "Access-Control-Allow-Origin" to bad requests 
    */ 
    @Override 
    public Promise<Result> onBadRequest(Http.RequestHeader request, String error) { 
    return Promise.<Result>pure(new CORSResult(BadRequest())); 
    } 

    /* 
    * Adds the required CORS header "Access-Control-Allow-Origin" to requests that causes an exception 
    */ 
    @Override 
    public Promise<Result> onError(Http.RequestHeader request, Throwable t) { 
    return Promise.<Result>pure(new CORSResult(InternalServerError())); 
    } 

    /* 
    * Adds the required CORS header "Access-Control-Allow-Origin" when a route was not found 
    */ 
    @Override 
    public Promise<Result> onHandlerNotFound(Http.RequestHeader request) { 
    return Promise.<Result>pure(new CORSResult(NotFound())); 
    } 

}