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

时间:2012-06-08 16:36:39

标签: ajax solr http-headers cors

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

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

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

4 个答案:

答案 0 :(得分:8)

您可以改用JSONP。请参阅此链接以获取示例

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

用pache前面的solr和conf apache发回标头。例如,

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

答案 3 :(得分:0)

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

我在这里复制文字:


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

java -jar start

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

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

我使用了以下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&gt; 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行),你应该可以看到你的版本。

您还希望获得&#34; jetty-util&#34;对于你的码头版本: http://mvnrepository.com/artifact/org.mortbay.jetty/jetty-util

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

现在获取您下载的servlet.jar和util.jar文件,并将其放入以下文件夹: 的solr-4.8.0 \示例\ 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示例jetty服务器上运行多个webapps,那么这将影响所有这些web应用程序。请注意,您已设置url模式以识别对生产设置有危险的任何域。这仅适用于本地测试。

此外,我确实尝试更改webapps文件夹中的web.xml文件,以便这些更改保持在本地,但在尝试使用它的几个小时之后,我放弃了,并发现将它放入全局webdefault工作。