Java 添加Restlet 2.3 CORS的正确方法

Java 添加Restlet 2.3 CORS的正确方法,java,ajax,rest,cors,restlet,Java,Ajax,Rest,Cors,Restlet,标题上写着。。。向Restlet 2.3添加正确的CORS支持的正确/推荐方法是什么?Restlet 2.3实现了ChallengeAuthenticator,允许飞行前选项在未经授权的情况下访问标头信息 最初我认为我可以将@Options注释添加到资源界面: @Options void getCorsSupport(); 然后用这样的方法实现它: @Override public void getCorsSupport() { Series<Header> hea

标题上写着。。。向Restlet 2.3添加正确的CORS支持的正确/推荐方法是什么?Restlet 2.3实现了
ChallengeAuthenticator
,允许飞行前选项在未经授权的情况下访问标头信息

最初我认为我可以将
@Options
注释添加到资源界面:

@Options
void getCorsSupport();
然后用这样的方法实现它:

@Override
public void getCorsSupport() {
        Series<Header> headers = getResponse().getHeaders();
        headers.set("Access-Control-Expose-Headers", "Authorization, Link, X-RateLimit-Limit, X-RateLimit-Remaining, X-OAuth-Scopes, X-Accepted-OAuth-Scopes");

        Set<String> head = new HashSet<>();
        head.add("Authorization");
        head.add("Content-Type");
        head.add("X-Requested-With");
        getResponse().setAccessControlAllowHeaders(head);

        Set<Method> methods = new HashSet<>();
        methods.add(Method.ALL);

        getResponse().setAccessControlAllowMethods(methods);
        getResponse().setAccessControlAllowCredentials(true);
        Series<Header> reqHeaders = getRequest().getHeaders();
        String requestOrigin = reqHeaders.getFirstValue("Origin", false, "*");
        getResponse().setAccessControlAllowOrigin(requestOrigin);
    }
我认为这可能是一种干净的方法,可以避免为每个服务使用
@Options
方法。然而,我一定是做错了什么,因为这似乎什么都没有做

进一步研究后,我发现还有一种东西叫做
CorsFilter
,它的实例化方式似乎与
CorsService
非常相似,只是它在
createInboundRoot()
方法中连接到
Router
。但是,我不明白应该如何实现它以与
ChallengeAuthenticator
配合使用

附录:

  • 我在代码中发现应该处理飞行前的问题

您需要设置CorsService的另一个属性,称为“skipResourceForCorsOptions”。例如:

    CorsService corsService = new CorsService();
    corsService.setAllowingAllRequestedHeaders(true);
    corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
    corsService.setAllowedCredentials(true);
    corsService.setSkippingResourceForCorsOptions(true);
以下是javadocs:


用户指南中将添加一个更详细的页面,地址为:。

应该可以。。。但事实并非如此。我想有一只虫子。使用
getServices()!添加
setskipingresourceforcorsoptions
实际上会导致跳过资源,但无论我是否使用
setskipingresourceforcorsoptions
,服务中指定的头都不会出现在响应中。我在2.3.4和2.3.5中尝试了它。它似乎只在请求中存在
来源:
头时添加头,否则您显然不需要CORS。所以,如预期的那样,我猜测。是的,我们认为这个标头是强制性的,即使规范不明确。至少大多数浏览器都设置了它。
    CorsService corsService = new CorsService();
    corsService.setAllowingAllRequestedHeaders(true);
    corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
    corsService.setAllowedCredentials(true);
    corsService.setSkippingResourceForCorsOptions(true);