Как включить Cross Origin Resource Sharing (CORS) в REST-сервисе Fantom / afBedSheet?

Я разрабатываю REST API с помощью Fantom и afBedSheet. Мне нужно разрешить совместное использование ресурсов между источниками, чтобы я мог вызывать свои службы RESTful через AJAX из пользовательского интерфейса, который работает в другом веб-контейнере на другом порту.

В настоящее время я делаю это в методах обработчика запросов:

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

Но по мере роста API и увеличения числа обработчиков запросов это уже не практично. Мне интересно, как я могу вставить этот заголовок в каждом ответе. Я гуглил вопрос, но нашел ссылку на документ только из очень старой версии afBedSheet, которая больше не актуальна. Кто-нибудь может привести пример, пожалуйста?

1 ответ

Решение

CORS должен быть настроен вручную, но, как уже упоминалось, это не так сложно. Все, что становится повторяющимся в методах-обработчиках запросов, обычно можно где-то спрятать, и установка заголовков HTTP-ответов ничем не отличается. Они могут быть установлены с помощью промежуточного программного обеспечения BedSheet:

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.

Простыня Middleware должны быть внесены в MiddlewarePipeline оказание услуг:

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

Обратите внимание, что CorsMiddleware вставляется в конвейер перед маршрутами BedSheet, чтобы обеспечить его выполнение.

Другие вопросы по тегам