2012-04-03 2 views
5

Я пытаюсь настроить поддержку CORS в Грааль, и я использую следующий фильтр:CORS in grails - все запросы терпят неудачу?

class CorsFilters { 
    def filters = { 
     all(controller:'*', action:'*') { 
      before = { 
       response.setHeader("Access-Control-Allow-Origin", "*") 
      } 
     } 
    } 
} 

От тестирования, он выглядит как заголовок ответа правильно настроен для всех запросов, но когда я делаю запрос извне на локальном или какой-то сервер доступного для меня, я получаю следующее сообщение об ошибке:

XMLHttpRequest cannot load http://server:8080. Origin http://jsbin.com is not allowed by Access-Control-Allow-Origin. 

This live example работает в моем экземпляре Chrome, так что я не знаю, что может быть здесь происходит. В запросах, которые терпят неудачу, я пытаюсь нажать tomcat напрямую.

Что может случиться, чтобы это не получилось?

+0

Две вещи приходят на ум. 1. Использование localhost (домен первого уровня) не является хорошей идеей; Я не могу найти источник прямо сейчас, но у меня были проблемы недавно с этим. Используйте файл hosts для установки поддельного хоста. 2. Является ли код в JSBin тем, что вы используете для запроса? Если нет, некоторые библиотеки/рамки JS могут сначала отправить запрос OPTIONS (предварительный запрос), который вам необходимо ответить соответствующим образом. Подтвердите, если это так, и я могу дать ответ, я уже разработал решение в Grails. Удачи! – Esteban

ответ

2

Похоже, что фильтры Grails по умолчанию используются слишком поздно в цепочке фильтров.

Если вы создаете шаблон web.xml и добавляете фильтр под sitemesh, это работает.

<filter> 
    <filter-name>CORSFilter</filter-name> 
    <filter-class>com.blah.CorsFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CORSFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

и

class CorsFilter implements Filter { 
    public void init(FilterConfig fConfig) throws ServletException { } 

    public void destroy() { } 

    public void doFilter(
      ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 

     ((HttpServletResponse) response).addHeader(
       "Access-Control-Allow-Origin", "*" 
     ) 
     chain.doFilter(request, response) 
    } 
} 
+7

Я написал плагин Grails, чтобы сделать это: http://grails.org/plugin/cors –

+2

Просто отредактируйте BuildConfig.groovy: plugins {runtime ": cors: 1.0.0" ... } –

0

Access-Control-Allow-Origin должно содержать точное доменное имя (кстати, для некоторых браузеров '*' также работает), jsbin.com в вашем случае.

+0

Подстановочный знак '*' также является вполне допустимым значением - см. [\ [Spec \]] (http://www.w3.org/TR/cors/#http-access-control-allow-origin). –

+0

Да, я знаю. Но браузеру не нужны спецификации –

1

Вы можете установить происхождение динамически. Я также рекомендую добавлять весь набор заголовков, когда это применимо.

response.setHeader('Access-Control-Allow-Origin', request.getHeader("Origin")) 
response.setHeader('Access-Control-Allow-Methods', 'POST, PUT, GET, OPTIONS, PATCH') 
response.setHeader('Access-Control-Allow-Headers', 'X-Additional-Headers-Example') 
response.setHeader('Access-Control-Allow-Credentials', 'true') 
response.setHeader('Access-Control-Max-Age', '1728000') 
+0

Почему это хорошо или необходимо? –

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

  • Нет связанных вопросов^_^