如何在 play 2.2.0 Java 中实现 CORS 过滤器?
Posted
技术标签:
【中文标题】如何在 play 2.2.0 Java 中实现 CORS 过滤器?【英文标题】:How to implement a CORS Filter in play 2.2.0 Java? 【发布时间】:2014-03-14 20:04:05 【问题描述】:我到处寻找,但我创建的所有解决方案都对我不起作用,我认为问题出在我的游戏版本中,但无论如何,有人可以帮助我在 Java 中实现一个 CORS 过滤器玩 2.2.0+。对不起我的英语,我不太确定它是否清楚。
我实现了这段代码:
public class CorsComposition
/**
* Wraps the annotated action in an <code>CorsAction</code>.
*/
@With(CorsAction.class)
@Target( ElementType.TYPE, ElementType.METHOD )
@Retention(RetentionPolicy.RUNTIME)
public @interface Cors
String value() default "*";
public static class CorsAction extends Action<Cors>
@Override
public Promise<SimpleResult> call(Context context) throws Throwable
Response response = context.response();
response.setHeader("Access-Control-Allow-Origin", "*");
//Handle preflight requests
if(context.request().method().equals("POST"))
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");
return delegate.call(context);
response.setHeader("Access-Control-Allow-Headers","X-Requested-With, Content-Type, X-Auth-Token");
return delegate.call(context);
在我的控制器中,我添加了注解 @Cors。这对请求没问题,但是当我使用 POST 时,它不起作用。我的 Chrome 控制台上显示了 CROSS ORIGIN NOT ALLOWED 的错误。
【问题讨论】:
请告诉我们你到目前为止做了什么。如果没有您的帮助,*** 无法为您提供完成的实现。你到底是哪里出了问题? 抱歉,问题已编辑 问题解决了,实际上,问题是方法的返回没有返回,因为绑定错误停止了方法。所以这段代码适用于 CORS 问题,所以任何人都可以使用它。 为您自己的问题放置一个答案,并在两天后将其标记为正确,而不是在问题标题中放置 SOLVED 【参考方案1】:问题解决了,实际上,问题是返回的方法没有返回,因为绑定错误停止了方法。所以这段代码适用于 CORS 问题,所以任何人都可以使用它。
【讨论】:
您能否解释一下 Route OPTIONs /cors Controller.cors() 的工作原理。您是否建议 CorsComposition 应该扩展控制器。即使它确实 Cors 也不是一个可识别的功能【参考方案2】:我对 java 和玩还是很陌生。非常感谢这段代码@renatomattos2912!
我只是在正确的包含方面遇到了一些问题。所以我希望没关系,当我发布最终文件版本时:
path: app/actions/CorsComposition.java
文件:
package actions;
import play.libs.F;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.SimpleResult;
import play.mvc.With;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class CorsComposition
/**
* Wraps the annotated action in an <code>CorsAction</code>.
*/
@With(CorsAction.class)
@Target( ElementType.TYPE, ElementType.METHOD )
@Retention(RetentionPolicy.RUNTIME)
public @interface Cors
String value() default "*";
public static class CorsAction extends Action<Cors>
@Override
public F.Promise<SimpleResult> call(Http.Context context) throws Throwable
Http.Response response = context.response();
response.setHeader("Access-Control-Allow-Origin", "*");
//Handle preflight requests
if(context.request().method().equals("POST"))
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");
return delegate.call(context);
response.setHeader("Access-Control-Allow-Headers","X-Requested-With, Content-Type, X-Auth-Token");
return delegate.call(context);
更新 也将这些添加到您的所有控制器中:
@CorsComposition.Cors
上面的这段代码适用于我的 GET 请求。但对于帖子等,我得到了同样的错误。 为了解决这个问题,我在我的路由配置中添加了这些路由
OPTIONS /*path controllers.Application.preflight(path: String)
在我的应用程序控制器中:
public static Result preflight(String path)
return ok("");
【讨论】:
嗨@roman,谢谢你,也感谢这篇博文对我的帮助daniel.reuterwall.com/blog/2013/04/15/play-with-cors 并享受代码=)。关于你的问题,也许这个要点可以帮助你gist.github.com/renatomattos2912/9844710 感谢您的链接@renatomattos2912!我以前也发现过这些。但它们的代码略有不同,不适用于 play 2.2.X(在我的设置中?) 是的,博客代码不适用于 play 2.2+,但我的 gist 代码有效,我遇到了和你现在一样的问题,然后我更改了博客代码和我的 gist是结果,如果你还有问题,告诉我。干杯 我应该在路由文件中添加什么。选项/什么?什么。以上是关于如何在 play 2.2.0 Java 中实现 CORS 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章