2015-09-30 22 views
2

標題說明了...什麼是加入適量的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這似乎在幾乎相同的方式進行實例化,除了這個CorsServicecreateInboundRoot()方法被連接到Router。但我不明白應該如何實施與ChallengeAuthenticator一起工作。

附錄:

  • 我在代碼中暗示飛行前應處理髮現this

回答

2

您需要設置CorsService的另一個名爲「skipResourceForCorsOptions」的屬性。例如:

CorsService corsService = new CorsService(); 
    corsService.setAllowingAllRequestedHeaders(true); 
    corsService.setAllowedOrigins(new HashSet(Arrays.asList("*"))); 
    corsService.setAllowedCredentials(true); 
    corsService.setSkippingResourceForCorsOptions(true); 

這裏是的Javadoc:http://restlet.com/technical-resources/restlet-framework/javadocs/2.3/jse/api/org/restlet/service/CorsService.html#setSkippingResourceForCorsOptions%28boolean%29

的更詳細的頁將在用戶指南中加入,在此地址:http://restlet.com/technical-resources/restlet-framework/guide/2.3/core/services/cors

+0

這應該工作...但是沒有。我想有一個錯誤。使用'getServices().add(CorsService)'不會爲響應添加任何頭文件!添加'setSkippingResourceForCorsOptions'事實上確實導致跳過資源,但沒有在服務中指定的標題都在響應無論我是否使用'setSkippingResourceForCorsOptions'。我在2.3.4和2.3.5中試過了。 – tarka

+0

似乎只在請求中包含「Origin:」標頭時才添加標頭,否則顯然不需要CORS。所以,我猜想按預期工作。 – letmaik

+0

是的,我們認爲這個頭是強制性的,即使規範不明確。至少大多數瀏覽器設置它。 –