2012-06-08 58 views
6

是否可以设置从solrconfig.xml文件内发送自定义HTTP响应头?我在考虑可能会在<requestDispatcher>部分添加一些配置,因为它控制缓存标题。Apache Solr:设置来自solrconfig.xml的HTTP响应头对于CORS

我确信在servlet容器配置(Jetty,Tomcat等)中这是可能的,但是我希望在Solr的配置文件中尽可能做到这一点。

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

回答

7

您可以改用JSONP。请参阅此链接的例子

+0

感谢您的链接。我一定会认为这是我的后备,但如果可能的话,我希望得到真正的CORS工作。 –

+0

对不起,花了这么长时间才能给你信用。我终于实现了该解决方案,并最终使用JSONP,因为它支持Solr。 –

1

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

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

0

使用apache的前端解决方案,并且conf apache发回头文件。例如,

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

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

我在这里再现文本:


在这个例子中Solr的项目,当您启动它通过调用下面一行:

Java的罐子开始

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

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

我用下面的jar: http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/8.1.10.v20130312/

但是你可能需要得到最适合您的码头的版本的版本: http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/

你可以找到你正在运行的是什么版本的Jetty以你的solr为例: java -jar start --version

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

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 \码头服务器(在转储上述这是第5行),你应该能够看到你的版本就行了。

您也想获得“码头-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 \例子\ lib中

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

最后,让这些更改生效,要开辟Solr的-4.8.0 \例子\等\ 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 patter设置为识别对于生产设置有危险的任何域。这仅用于本地测试。

此外,我也尝试更改webapps文件夹中的web.xml文件,以便这些更改将保持本地化,但经过几小时试图让它去,我放弃了,发现它在全球webdefault工作。