如何将 ActiveMQ AJAX servlet 与 CORS 一起使用?
How can I use ActiveMQ AJAX servlet with CORS?
如果我有一个 Web 应用程序连接到一个已删除的 Active MQ 服务器,我如何启用 CORS 以允许跨域通信?
这花了我很多时间才弄清楚,而且不是很明显,所以我将在此处记录更改。这已通过 ActiveMQ 5.10 完成。
首先,您需要一个 CORS 过滤器来将适当的 headers 添加到响应中。我尝试使用内置的 Jetty cors 过滤器 (http://wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter),但我感觉它没有正确响应 POST 预检选项请求。但是,还有第二个问题阻止了我的 CORS 连接,所以请不要相信我说的 Jetty CORS 过滤器不起作用(我放弃了它并且没有再试一次)。
相反,我使用 http://software.dzhuvinov.com/cors-filter.html. Note that version 2.2.1 of this library does not work (it duplicates headers like Access-Control-Allow-Origin, which is not permitted), however a small fix (replacing addHeader with setHeader) was all that it took to make it work. See https://github.com/AutoGeneral/cors-filter 处的过滤器作为固定代码。
现在您需要更新 amq_jquery_adapter.js 文件以包含 xhrFields withCredentials 字段(参见 CORS request - why are the cookies not sent?)。所以代码看起来像这样:
ajax: function(uri, options) {
request = {
url: uri,
data: options.data,
success: options.success || function(){},
error: options.error || function(){},
xhrFields: {
withCredentials: true
}
}
因此,使用您的 CORS 过滤器和更新的 jQuery ajax 请求设置,您将能够向 AJAX servlet 发出 CORS 请求。
看来这种设置withCredentals的方式对我不起作用。我使用了码头 CORS servlet,并以这种方式设置了 withCredentials,然后它才开始工作:
xhr.withCredentials = 真;
并且在 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>
如果我有一个 Web 应用程序连接到一个已删除的 Active MQ 服务器,我如何启用 CORS 以允许跨域通信?
这花了我很多时间才弄清楚,而且不是很明显,所以我将在此处记录更改。这已通过 ActiveMQ 5.10 完成。
首先,您需要一个 CORS 过滤器来将适当的 headers 添加到响应中。我尝试使用内置的 Jetty cors 过滤器 (http://wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter),但我感觉它没有正确响应 POST 预检选项请求。但是,还有第二个问题阻止了我的 CORS 连接,所以请不要相信我说的 Jetty CORS 过滤器不起作用(我放弃了它并且没有再试一次)。
相反,我使用 http://software.dzhuvinov.com/cors-filter.html. Note that version 2.2.1 of this library does not work (it duplicates headers like Access-Control-Allow-Origin, which is not permitted), however a small fix (replacing addHeader with setHeader) was all that it took to make it work. See https://github.com/AutoGeneral/cors-filter 处的过滤器作为固定代码。
现在您需要更新 amq_jquery_adapter.js 文件以包含 xhrFields withCredentials 字段(参见 CORS request - why are the cookies not sent?)。所以代码看起来像这样:
ajax: function(uri, options) {
request = {
url: uri,
data: options.data,
success: options.success || function(){},
error: options.error || function(){},
xhrFields: {
withCredentials: true
}
}
因此,使用您的 CORS 过滤器和更新的 jQuery ajax 请求设置,您将能够向 AJAX servlet 发出 CORS 请求。
看来这种设置withCredentals的方式对我不起作用。我使用了码头 CORS servlet,并以这种方式设置了 withCredentials,然后它才开始工作: xhr.withCredentials = 真;
并且在 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>