Apache Solr:从 solrconfig.xml 为 CORS 设置 HTTP 响应标头

Posted

技术标签:

【中文标题】Apache Solr:从 solrconfig.xml 为 CORS 设置 HTTP 响应标头【英文标题】:Apache Solr: Setting HTTP Response Headers From solrconfig.xml For CORS 【发布时间】:2012-06-12 17:52:51 【问题描述】:

是否可以从solrconfig.xml 文件中设置自定义 HTTP 响应标头的发送?我在想可能可以在<requestDispatcher> 部分添加一些配置,因为它控制缓存标头。

我确信这在 servlet 容器配置(Jetty、Tomcat 等)中是可能的,但如果可能的话,我想在 Solr 的配置文件中执行此操作。

如果这有什么不同,我正在尝试为来自不同主机的 CORS AJAX 请求设置一个 Access-Control-Allow-Origin 标头。

【问题讨论】:

【参考方案1】:

您可以改用 JSONP。示例见此链接

Solr and JSONP

【讨论】:

感谢您的链接。我肯定会考虑将此作为我的后备方案,但如果可能的话,我希望让真正的 CORS 工作。 抱歉花了这么长时间才给你信用。我最终实现了解决方案并最终选择了 JSONP,因为 Solr 内置了对它的支持。【参考方案2】:

最简单的方法是编写自定义 javax.servlet.Filter 并在此处添加 Access-Control-Allow-Origin 标头。有关处理 HTTP 处理的代码,请参阅org.apache.solr.servlet.SolrDispatchFilter 类。

这是您继续操作的最简单方法。如果您查看 SolrDispatchFilter 中的 doFilter - 对 HTTP 标头的唯一操作是缓存它们,并且没有地方以某种方式接触它们。

【讨论】:

【参考方案3】:

front solr 与 apache,并 conf apache 发回标头。例如,

Header set X-Server-Name "abc0.com"

【讨论】:

【参考方案4】:

我发现this 很有帮助。您需要添加几个码头 jar 和 webdefault.xml 更改才能启用 CORS。

我在这里复制文字:


在示例 solr 项目中,当您通过调用以下行来启动它时:

java -jar 启动

您正在本地计算机上启动一个 Jetty 服务器,该服务器将提供 solr 结果。此服务器无法进行 CORS(跨源资源共享)。这意味着,如果您尝试从与服务器本身不同来源的网页进行 AJAX 调用,您将被拒绝响应。

要解决此问题,您首先需要获取适当的 jar 以允许跨域资源共享。

我使用了以下罐子: http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/8.1.10.v20130312/

但您可能需要获取适合您的 jetty 版本的版本: http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/

您可以通过以下方式了解您正在使用 solr 示例运行的 Jetty 版本: java -jar start --version

您会看到如下转储: C:\Users\username\Desktop\solr-4.8.0\example>java -jar start.jar --version 活动选项:[默认,*] 类路径中 18 个条目的版本信息。 注意:此处显示的顺序是它们在类路径中的显示方式。 对 OPTIONS=[option,option,...] 命令行选项的更改将反映在他 回复。

0:                (dir) | $jetty.home\resources
 1:     8.1.10.v20130312 | $jetty.home\lib\jetty-xml-8.1.10.v20130312.jar
 2:  3.0.0.v201112011016 | $jetty.home\lib\servlet-api-3.0.jar
 3:     8.1.10.v20130312 | $jetty.home\lib\jetty-http-8.1.10.v20130312.jar
 4:     8.1.10.v20130312 | $jetty.home\lib\jetty-continuation-8.1.10.v20130312.jar
 5:     8.1.10.v20130312 | $jetty.home\lib\jetty-server-8.1.10.v20130312.jar
 6:     8.1.10.v20130312 | $jetty.home\lib\jetty-security-8.1.10.v20130312.jar
 7:     8.1.10.v20130312 | $jetty.home\lib\jetty-servlet-8.1.10.v20130312.jar
 8:     8.1.10.v20130312 | $jetty.home\lib\jetty-webapp-8.1.10.v20130312.jar
 9:     8.1.10.v20130312 | $jetty.home\lib\jetty-deploy-8.1.10.v20130312.jar
10:     8.1.10.v20130312 | $jetty.home\lib\jetty-servlets-8.1.10.v20130312.jar
11:                1.7.6 | $jetty.home\lib\ext\jcl-over-slf4j-1.7.6.jar
12:                1.7.6 | $jetty.home\lib\ext\jul-to-slf4j-1.7.6.jar
13:               1.2.16 | $jetty.home\lib\ext\log4j-1.2.16.jar
14:                1.7.6 | $jetty.home\lib\ext\slf4j-api-1.7.6.jar
15:                1.7.6 | $jetty.home\lib\ext\slf4j-log4j12-1.7.6.jar
16:     8.1.10.v20130312 | $jetty.home\lib\jetty-util-8.1.10.v20130312.jar
17:     8.1.10.v20130312 | $jetty.home\lib\jetty-io-8.1.10.v20130312.jar

查找 $jetty.home\lib\jetty-server 行(在第 5 行上方的转储中),您应该能够看到您的版本。

您还需要为您的码头版本获取“jetty-util”: http://mvnrepository.com/artifact/org.mortbay.jetty/jetty-util

您应该可以在那里找到您的版本。我使用了 jetty-util-8.1.10.v20130312.jar。

现在将您下载的 servlet.jar 和 util.jar 文件放入以下文件夹: solr-4.8.0\example\lib

对于您的版本,它可能会有所不同,但您希望它位于示例目录下的 lib 文件夹中。

最后,为了让这些更改生效,你要打开 solr-4.8.0\example\etc\webdefault.xml

并在</web-app>之前添加以下行:

   <filter>
       <filter-name>cross-origin</filter-name>
       <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>cross-origin</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

现在重新启动您的服务器,您应该启用了 CORS。

注意事项: 如果您开始喜欢并在 solr 示例码头服务器上运行多个 web 应用程序,那么这将影响所有这些 web 应用程序。请注意,您已将 url 模式设置为识别对生产设置有危险的任何域。这仅用于本地测试。

我还尝试更改 webapps 文件夹中的 web.xml 文件,以便这些更改将保持在本地,但经过数小时的尝试后,我放弃了,发现将其置于全局 webdefault 中是可行的。

【讨论】:

以上是关于Apache Solr:从 solrconfig.xml 为 CORS 设置 HTTP 响应标头的主要内容,如果未能解决你的问题,请参考以下文章

Solr基础教程之solrconfig.xml

Solr02-solrconfig.xml文件详细说明

让ExtractingRequestHandler在Solr中工作

solrconfig.xml和schema.xml说明

solrconfig.xml解析

solr启动时报错org.apache.solr.common.SolrException: undefined field text的解决办法