gpt4 book ai didi

java - Play Framework 2.3 - CORS header

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:55:24 24 4
gpt4 key购买 nike

更新 新的 Play 2.5 提供了一个新的 CORS Filter

随着新的 2.3 Java 版本完成了 Response 类到 Promise 类的迁移,以下代码不再有效。

public class CorsAction extends Action.Simple {

public Result call(Context context) throws Throwable{
Response response = context.response();
response.setHeader("Access-Control-Allow-Origin", "*");
//Handle preflight requests
if(context.request().method().equals("OPTIONS")) {
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content- Type, Accept, Authorization, X-Auth-Token");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Origin", "*");
return ok()

}

response.setHeader("Access-Control-Allow-Headers","X-Requested-With, Content-Type, X- Auth-Token");
return delegate.call(context);
}
}

我正在 Play (Java) 2.3 中开发一个应用程序,我查看并尝试了不同的方法来启用 CORS - 包括将/OPTIONS 方法添加到路由文件 - 但没有成功。

我非常希望了解新的 Response 实现如何处理这种类型的拦截,因为在新的 Promise 类中实现时它似乎不会对 header 产生任何影响。

在此先感谢您的帮助!!

最佳答案

通过以下方式解决:

来自服务器的所有 API 响应都应包含一个 header :“Access-Control-Allow-Origin”、“*”。我们需要为所有 Action 响应编写一个包装器。

在 Global.java 中

import java.net.URL;

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

public class Global extends GlobalSettings {

// For CORS
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));
}

}

像 POST、PUT 这样的服务器请求在主请求之前向服务器发出预检请求。这些预检请求的响应应包含以下 header :

“访问控制允许来源”,“”“允许”、“”“访问控制允许方法”、“POST、GET、PUT、DELETE、OPTIONS”“Access-Control-Allow-Headers”、“Origin、X-Requested-With、Content-Type、Accept、Referer、User-Agent”

在路由中添加:

OPTIONS /*all                           controllers.Application.preflight(all)

在应用程序 Controller 中:

package controllers;

import play.mvc.*;

public class Application extends Controller {

public static Result preflight(String all) {
response().setHeader("Access-Control-Allow-Origin", "*");
response().setHeader("Allow", "*");
response().setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
response().setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Referer, User-Agent");
return ok();
}

}

PS:通过这种方法,我不必为此创建 Scala 过滤器。

关于java - Play Framework 2.3 - CORS header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com