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



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

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

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

你可以改用JSONP。有关示例,请参阅此链接

  • Solr 和 JSONP

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

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

前面的

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

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

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

我在这里复制文本:


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

Java -jar start

您正在本地计算机上启动一个 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=[选项,选项,...] 命令行选项的更改将反映在再。

0:                (dir) | ${jetty.home}resources
 1:     8.1.10.v20130312 | ${jetty.home}libjetty-xml-8.1.10.v20130312.jar
 2:  3.0.0.v201112011016 | ${jetty.home}libservlet-api-3.0.jar
 3:     8.1.10.v20130312 | ${jetty.home}libjetty-http-8.1.10.v20130312.jar
 4:     8.1.10.v20130312 | ${jetty.home}libjetty-continuation-8.1.10.v20130312.jar
 5:     8.1.10.v20130312 | ${jetty.home}libjetty-server-8.1.10.v20130312.jar
 6:     8.1.10.v20130312 | ${jetty.home}libjetty-security-8.1.10.v20130312.jar
 7:     8.1.10.v20130312 | ${jetty.home}libjetty-servlet-8.1.10.v20130312.jar
 8:     8.1.10.v20130312 | ${jetty.home}libjetty-webapp-8.1.10.v20130312.jar
 9:     8.1.10.v20130312 | ${jetty.home}libjetty-deploy-8.1.10.v20130312.jar
10:     8.1.10.v20130312 | ${jetty.home}libjetty-servlets-8.1.10.v20130312.jar
11:                1.7.6 | ${jetty.home}libextjcl-over-slf4j-1.7.6.jar
12:                1.7.6 | ${jetty.home}libextjul-to-slf4j-1.7.6.jar
13:               1.2.16 | ${jetty.home}libextlog4j-1.2.16.jar
14:                1.7.6 | ${jetty.home}libextslf4j-api-1.7.6.jar
15:                1.7.6 | ${jetty.home}libextslf4j-log4j12-1.7.6.jar
16:     8.1.10.v20130312 | ${jetty.home}libjetty-util-8.1.10.v20130312.jar
17:     8.1.10.v20130312 | ${jetty.home}libjetty-io-8.1.10.v20130312.jar

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

您还需要为您的码头版本获取"码头实用工具":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 中是有效的。

最新更新