Если у меня есть веб-приложение, подключающееся к удаленному серверу Active MQ, как я могу включить CORS для разрешения междоменной связи?
Как я могу использовать сервлет ActiveMQ AJAX с CORS?
Ответы:
Это заняло у меня довольно много времени, и это неочевидно, поэтому я задокументирую изменения здесь. Это было сделано с помощью ActiveMQ 5.10.
Во-первых, вам понадобится фильтр CORS, чтобы добавить в ответы соответствующие заголовки. Я пробовал использовать встроенный фильтр Jetty cors (http://wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter), но мне кажется, что он не отвечает на запросы OPTION предварительной проверки POST должным образом. Однако была вторая проблема, которая препятствовала моим соединениям CORS, поэтому не верьте мне на слово, что фильтр Jetty CORS не работает (я отказался от него и не пробовал снова).
Вместо этого я использовал фильтр по адресу http://software.dzhuvinov.com/cors-filter.html < / а>. Обратите внимание, что версия 2.2.1 этой библиотеки не работает (она дублирует заголовки, такие как Access-Control-Allow-Origin, что не разрешено), однако небольшое исправление (замена addHeader на setHeader) было всем, что потребовалось, чтобы заставить его работать . Исправленный код см. https://github.com/AutoGeneral/cors-filter.
Теперь вам нужно обновить файл amq_jquery_adapter.js, включив в него поле xhrFields withCredentials (см. Запрос CORS - почему файлы cookie не отправляются?). Итак, код выглядит так:
ajax: function(uri, options) {
request = {
url: uri,
data: options.data,
success: options.success || function(){},
error: options.error || function(){},
xhrFields: {
withCredentials: true
}
}
Итак, с вашим фильтром CORS и обновленными настройками запроса jQuery ajax вы сможете выполнять запросы CORS к сервлету AJAX.
Похоже, этот способ настройки withCredentals у меня не сработал. Я использовал сервлеты CORS и установил withCredentials таким образом, только тогда он начал работать: xhr.withCredentials = true;
А на стороне сервера в web.xml:
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter- class>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>allowedHeaders</param-name>
<param-value>X-Requested-With,Content-Type,Accept,Origin</param-value>
</init-param>
<init-param>
<param-name>allowedCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>