【问题标题】:Solr, Tomcat and CORSSolr、Tomcat 和 CORS
【发布时间】:2016-07-09 13:06:21
【问题描述】:

我在 Apache Tomcat 9 上运行 solr 4.3。它被部署为 web 应用程序,并被 crm 产品用于提供索引。

我们需要对索引进行搜索,因此我试图质疑 solr,并且正在使用以下查询:

http://localhost:8888/solr-intranet-int/intranet_users/suggest?q=(surname_t:*on*)

在我的邮递员客户端中运行良好,因此可以在集成之前构建一个快速测试页面。测试页面是托管在其自己的 IIS 网站上的纯 html,因此位于与 solr 实例不同的域中。

测试页面中的jquery如下所示:

$("#bob").autocomplete({
          source: function(request, response)
          {         
            var input = $("#bob").val();

            $.ajax({
                type: "GET",
                dataType: "application/xml",
                url:"http://localhost:8888/solr-intranet-int/intranet_users/suggest?q=surname_t:*" + input + "*",
                success: function(data)
                    {
                        $('input.suggest-user').removeClass('ui-autocomplete-loading');

                        response($.map(data, function(item) {
                            // todo
                        }));
                    },
                error: (function(data) {
                    $("#bob").removeClass('ui-autocomplete-loading');
                })
            });
          },
          minLength: 3,
          open: function() {},
          close: function() {},
          focus: function(event,ui) {},
          select: function(event, ui) {}
      });
    });

我得到了预期的 CORS 错误,因此开始尝试在 TOMCAT 中使用以下内容修复这些错误

 <filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>http://localhost:5757</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Authorization</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials, Authorization</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

我不确定如何继续。我能找到的所有文档都与 solr 5 中的 Jetty 相关,因为它们已经离开了 tomcat,但是必须离开才能获取接受标头,目前我在浏览器中收到以下错误:

XMLHttpRequest 无法加载 http://localhost:8888/solr-intranet-int/intranet_users/suggest?q=surname_t:琼斯。 请求中不存在“Access-Control-Allow-Origin”标头 资源。因此不允许使用原点“http://localhost:5757” 访问。

【问题讨论】:

    标签: jquery tomcat solr cors


    【解决方案1】:

    最后我通过使用第三方 cors 过滤器解决了这个问题:我在 solr 应用程序级别而不是在 tomcat 服务器级别使用它:

     <filter>
        <filter-name>CORS</filter-name>
        <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
          <init-param>
                    <param-name>cors.allowOrigin</param-name>
                    <param-value>*</param-value>
            </init-param>
      </filter>
      <filter-mapping>
        <filter-name>CORS</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    【讨论】:

    • 我知道 * 对生产来说是个坏主意 :)
    • jsonp 也是一种实现方式,因为 solr 开箱即用 (json.wrf) 支持它。
    猜你喜欢
    • 2013-12-18
    • 2012-08-22
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 2015-10-13
    • 2014-03-30
    • 2013-11-03
    相关资源
    最近更新 更多