2016-06-16 2 views
3

Я пытаюсь получить доступ к моему REST API, который я построил с помощью Finatra через вызовы AJAX. К сожалению, я получаю следующее сообщение об ошибке:Finatra access-control-allow-origin

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 

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

override def configureHttp(router: HttpRouter) { 
    router 
    .filter(new HttpFilter(Cors.UnsafePermissivePolicy)) 
    .add(controller) 
} 

Как правильно установить заголовки, чтобы позволить CORS в Finatra?

+0

Вы пробовали ['' '' CorsFilter'''] (https://github.com/twitter/finagle/blob/develop/finagle-http/src/main/scala/com/twitter/finagle/http/ фильтр/Cors.scala # L236)? –

ответ

2

Помимо CorsFilter, вам необходимо добавить контроллер для управления всеми preflighted OPTIONS запросы (пожалуйста, ссылку: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests), что-то вроде этого:

class CorsController extends Controller { 
    options("/api/:*") { 
    _: Request => response.ok 
    } 
} 

если не preflighted запросы не будут обрабатываться.

1

Можно добавлять общие фильтры приложений для каждого фильтра контроллера или даже фильтров действий. Посмотрите на раздел this фильтров в финатре.

Его можно использовать с фильтром для каждого контроллера, чтобы решить проблему Cors. В Server.scala файле он определен фильтр:

import com.twitter.finagle.{Filter, Service, SimpleFilter} 

class CorsFilter extends SimpleFilter[Request, Response] { 
    override def apply(request: Request, service: Service[Request, Response]): Future[Response] = { 

     service(request).map { 
      response => response.headerMap 
       .add("access-control-allow-origin", "*") 
       .add("access-control-allow-headers", "accept, content-type") 
       .add("access-control-allow-methods", "GET,HEAD,POST,DELETE,OPTIONS,PUT,PATCH") 

      response 
     } 
} 

затем, в разделе где вы определяете свой сервер, зарегистрировать контроллеры и прикрепить к нему фильтр, который вы только что создали:

object ServerMain extends Server 

class Server extends HttpServer { 

    override val name = "com.example.server" 

    override def configureHttp(router: HttpRouter) { 
    router   
     .filter[CommonFilters] 
     .filter[LoggingMDCFilter[Request, Response]] 
     .filter[TraceIdMDCFilter[Request, Response]]   
     .add[CorsFilter, MainController] // see the CorsFilter here  
    } 
} 

I Надеюсь, поможет.

Смежные вопросы