標題說明了...什麼是加入適量的CORS的正確/推薦的方式支持的Restlet 2.3實現一個ChallengeAuthenticator
允許飛行前選擇訪問頭信息沒有授權頭?正確的方式來增加的Restlet 2.3 CORS
原本我以爲我可以添加@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
請求將被免除ChallengeAuthenticator
和上述報頭將被返回。可悲的是,這是不是這種情況和AJAX飛行前Options
請求經受ChallengeAuthenticator
其他事物一樣。這意味着請求失敗,因爲它沒有被授予其所需的Access-Control-Allow-Origin
標題。
然後我做了一些研究,發現它似乎是可以註冊與該應用程序CorsService
。
public class WebApi extends Application {
public WebApi() {
getServices().add(createCorsService());
}
...
private CorsService createCorsService() {
CorsService corsService = new CorsService();
corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
corsService.setAllowedCredentials(true);
corsService.setAllowedCredentials(true);
corsService.setAllowingAllRequestedHeaders(true);
Set<String> allowHeaders = new HashSet<>();
allowHeaders.add("Authorization");
allowHeaders.add("Content-Type");
allowHeaders.add("X-Requested-With");
corsService.setAllowedHeaders(allowHeaders);
Set<String> exposeHeaders = new HashSet<>();
exposeHeaders.add("Authorization");
exposeHeaders.add("Link");
exposeHeaders.add("X-RateLimit-Limit");
exposeHeaders.add("X-RateLimit-Remaining");
exposeHeaders.add("X-OAuth-Scopes");
exposeHeaders.add("X-Accepted-OAuth-Scopes");
corsService.setExposedHeaders(exposeHeaders);
return corsService;
}
}
我想這可能是一個乾淨的方式,以避免爲每個服務的@Options
方法。但是,我一定在做錯事,因爲這看起來什麼都不做。
研究進一步的我發現也有這樣的事,作爲一個CorsFilter
這似乎在幾乎相同的方式進行實例化,除了這個CorsService
在createInboundRoot()
方法被連接到Router
。但我不明白應該如何實施與ChallengeAuthenticator
一起工作。
附錄:
- 我在代碼中暗示飛行前應處理髮現this。
這應該工作...但是沒有。我想有一個錯誤。使用'getServices().add(CorsService)'不會爲響應添加任何頭文件!添加'setSkippingResourceForCorsOptions'事實上確實導致跳過資源,但沒有在服務中指定的標題都在響應無論我是否使用'setSkippingResourceForCorsOptions'。我在2.3.4和2.3.5中試過了。 – tarka
似乎只在請求中包含「Origin:」標頭時才添加標頭,否則顯然不需要CORS。所以,我猜想按預期工作。 – letmaik
是的,我們認爲這個頭是強制性的,即使規範不明確。至少大多數瀏覽器設置它。 –