Java 添加Restlet 2.3 CORS的正确方法
标题上写着。。。向Restlet 2.3添加正确的CORS支持的正确/推荐方法是什么?Restlet 2.3实现了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
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 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);