如何在Fantom / afBedSheet REST服务中启用跨源资源共享(CORS)?

时间:2016-02-09 21:52:20

标签: fantom afbedsheet

我正在使用FantomafBedSheet开发REST API。我需要允许跨源资源共享,以便我可以通过AJAX从不同端口上不同Web容器上运行的UI调用我的RESTful服务。

我目前正在请求处理程序方法中执行此操作:

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

但随着API的增长和请求处理程序数量的增长,它已不再实用。我想知道如何在每个响应中注入该标头。我用谷歌搜索了这个问题,但只找到了very old version of afBedSheet中一个似乎不再相关的文档的引用。有人可以提供一个例子吗?

1 个答案:

答案 0 :(得分: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 - 对于dev来说非常方便,但对于实时代码,您应该更挑剔并验证任何给定的Origins,Methods和Headers。

BedSheet Middleware应该提供给MiddlewarePipeline服务:

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

请注意,{/ 1}}在 BedSheet路由之前插入管道中,以确保它被执行。