2012-06-08 98 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工作。