如何在 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 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Play Framework 2.x 中实现摘要式身份验证

在 Swift 中实现 Google Play 游戏服务

在JAVA中实现文件读写练习

如何在android的jni线程中实现回调

如何在 C 中实现位集?

如何在java中实现接口类