如何将 ActiveMQ AJAX servlet 与 CORS 一起使用?

Posted

技术标签:

【中文标题】如何将 ActiveMQ AJAX servlet 与 CORS 一起使用?【英文标题】:How can I use ActiveMQ AJAX servlet with CORS? 【发布时间】:2015-03-14 18:39:44 【问题描述】:

如果我有一个 Web 应用程序连接到删除的 Active MQ 服务器,我如何启用 CORS 以允许跨域通信?

【问题讨论】:

【参考方案1】:

似乎这种设置 withCredentals 的方式对我不起作用。我使用了码头CORS servlet,并以这种方式设置了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>

【讨论】:

【参考方案2】:

这花了我相当长的时间来解决,而且并不明显,所以我将在此处记录更改。这已在 ActiveMQ 5.10 中完成。

首先,您需要一个 CORS 过滤器来将适当的标头添加到响应中。我尝试使用内置的 Jetty cors 过滤器 (http://wiki.eclipse.org/Jetty/Feature/Cross_Origin_Filter),但我感觉它没有正确响应 POST preflight OPTION 请求。但是,还有第二个问题阻止了我的 CORS 连接,所以不要相信 Jetty CORS 过滤器不起作用(我放弃了它,没有再试一次)。

我在http://software.dzhuvinov.com/cors-filter.html 使用了过滤器。请注意,此库的 2.2.1 版不起作用(它复制了 Access-Control-Allow-Origin 之类的标头,这是不允许的),但是只需一个小修复(用 setHeader 替换 addHeader)即可使其工作.固定代码见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 请求。

【讨论】:

以上是关于如何将 ActiveMQ AJAX servlet 与 CORS 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jQuery $.ajax 将请求参数数组发送到 servlet?

如何通过 AJAX 在 ActiveMQ 中设置 TimeToLive 参数?

如何使用 JSP/Servlet 和 Ajax 将文件上传到服务器?

10秒后服务器响应时如何使用ajax发送请求?

Ajax 到 servlet

Ajax 到 servlet