2012-06-08 4 views
6

solrconfig.xml 파일에서 사용자 지정 HTTP 응답 헤더를 보낼 수 있습니까? 캐싱 헤더를 제어하기 때문에 <requestDispatcher> 섹션에 일부 구성을 추가 할 수 있다고 생각합니다.Apache Solr : CORR 용 solrconfig.xml에서 HTTP 응답 헤더 설정

서블릿 컨테이너 구성 (Jetty, Tomcat 등)에서 가능하다고 확신하지만 가능한 경우 Solr의 구성 파일에서이 작업을 수행하고 싶습니다.

다른 점이 있으면 다른 호스트의 CORS AJAX 요청에 대해 Access-Control-Allow-Origin 헤더를 설정하려고합니다.

답변

7

대신 JSONP를 사용할 수 있습니다. 예를 들어이 링크를 참조

+0

감사합니다. 나는 나의 후퇴를 위해이 점을 분명히 고려할 것이지만 가능한 한 실제 CORS를 원한다. –

+0

죄송합니다. 신용을 제공하는 데 너무 오래 걸렸습니다. 솔직히 JSONP에 대한 지원이 Solr에 내장되어 있으므로 마침내 솔루션을 구현하고 JSONP를 사용하게되었습니다. –

1

가장 쉬운 방법은 사용자 정의 javax.servlet.Filter를 작성하고 거기에 Access-Control-Allow-Origin 헤더를 추가하는 것입니다. HTTP 처리를 처리하는 코드의 경우 org.apache.solr.servlet.SolrDispatchFilter 클래스를 참조하십시오.

가장 쉬운 방법입니다. SolrDispatchFilter에서 doFilter를 살펴보면 HTTP 헤더를 사용하는 유일한 방법은 캐시하고 doctilter를 어떤 방식 으로든 만지는 곳이 없다는 것입니다.

0

아파치가있는 앞 솔 러와 conf 아파치가 헤더를 되돌려 보냅니다. 예 :

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

유용한 정보는 this입니다. CORS를 사용하려면 몇 개의 부두 단지와 webdefault.xml을 변경해야합니다.

나는 여기에 텍스트를 재현하고있다 : 예제 SOLR 프로젝트에서


당신이 다음 줄을 호출하여 시작할 때 :

자바 당신이를 시작

을 시작 -jar solr 결과를 제공 할 로컬 컴퓨터의 Jetty 서버. 이 서버는 CORS (Cross Origin Resource Sharing)를 수행 할 수 없습니다. 즉, 서버 자체와 다른 출처의 웹 페이지에서 AJAX 호출을 시도하면 응답이 거부됩니다.

이 문제를 해결하려면 먼저 도메인 간 리소스 공유가 가능하도록 apillary 항아리를 얻어야합니다.

나는 다음 항아리 사용 : http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/8.1.10.v20130312/

을하지만 당신은 부두의 버전에 맞아 버전을 얻을 필요가 있습니다 http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-servlets/

당신은 실행중인 부두의 버전을 확인할 수 있습니다 예를 들어 java -jar start --version

C : \ Users \ username \ Desktop \ solr-4.8.0 \ example> java -jar 다음과 같이 덤프가 표시됩니다. start.jar --version 활성 옵션 : [default, *] 버전 클래스 경로의 18 개 항목에 대한 정보. 참고 : 여기에 표시된 순서는 클래스 경로에 표시되는 순서입니다. OPTIONS = [option, option, ...] 명령 줄 옵션을 변경하면 해당 내용이 에 반영됩니다. (이 라인 (5)의 위의 덤프) 당신이 당신의 버전을 볼 수 있어야합니다 $ {jetty.home} \ lib 디렉토리 \ 부두 서버를 말한다 라인

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 

봐. http://mvnrepository.com/artifact/org.mortbay.jetty/jetty-util

당신이 버전을 찾을 수 있어야합니다 :

는 또한 "이 부두 - 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가 활성화되어 있어야합니다.

참고 : 솔직한 jetty 서버에서 멋진 웹 응용 프로그램을 실행하고 있으면이 모든 웹 응용 프로그램에 영향을줍니다. 프로덕션 설정에 위험한 도메인을 인식하도록 URL 패턴을 설정했는지 확인하십시오. 이는 로컬 테스트 용입니다.

또한 webapps 폴더의 web.xml 파일을 변경하려고 시도 했으므로 이러한 변경 사항은 로컬에 유지되지만 갈 시간이 지나면 포기하고 글로벌 webdefault에서 작업 한 것을 발견했습니다. .