2016-02-09 91 views
1

我正在開發一個REST API與FantomafBedSheet。我需要允許跨源資源共享,以便我可以通過AJAX從位於不同端口上不同Web容器上運行的UI調用RESTful服務。如何在Fantom/afBedSheet REST服務中啓用跨源資源共享(CORS)?

我目前做這在請求處理方法:

res.headers["Access-Control-Allow-Origin"] = "http://localhost:8080" 

但是,隨着API的發展和請求處理程序的數量增長,它不再實用。我想知道如何在每個響應中注入該標題。我已經Google搜索了這個問題,但只找到了一個來自very old version of afBedSheet的文檔,這個文檔看起來不再重要。任何人都可以提供一個例子嗎?

回答

1

CORS必須手動設置,但如前所述,這並不困難。任何在請求處理程序方法中變得重複的東西通常都可能在某處丟失,而設置HTTP響應頭文件也不例外。這些可以通過BedSheet Middleware設置:

using afIoc 
using afBedSheet 

const class CorsMiddleware : Middleware { 
    @Inject private const HttpRequest   req 
    @Inject private const HttpResponse   res 
    @Inject private const ResponseProcessors processors 

    new make(|This|in) { in(this) } 

    override Void service(MiddlewarePipeline pipeline) { 
     // echo back in the response, whatever was sent in the request 
     res.headers["Access-Control-Allow-Origin"] = req.headers["Origin"] 
     res.headers["Access-Control-Allow-Methods"] = req.headers["Access-Control-Request-Method"] 
     res.headers["Access-Control-Allow-Headers"] = req.headers["Access-Control-Request-Headers"] 

     // deal with any pre-flight requests 
     if (req.httpMethod == "OPTIONS") 
      processors.processResponse(Text.fromPlain("OK")) 
     else 
      pipeline.service 
    } 
} 

注意,在所有請求上述將使CORS - 方便用於開發,而是活的代碼,你應該更加挑剔和驗證任何給定的起源,方法,和標題。

牀單Middleware應促成MiddlewarePipeline服務:

@Contribute { serviceType=MiddlewarePipeline# } 
static Void contributeMiddleware(Configuration config) { 
    config.set("myApp.cors", config.autobuild(CorsMiddleware#)).before("afBedSheet.routes") 
} 

注意CorsMiddleware插入管道牀單路線,以確保其得到執行。

相關問題