2014-07-09 2 views
4

Jetty 9가 아닌 독립 실행 형 Jetty를 프록시로 사용하여 조사하고 있습니다. 나는 많은 곳에서 도움을 검토 한 결과 :독립 실행 형 Jetty 응용 프로그램에서 Jetty의 프록시 사용

이들의 대부분은 임베디드 부두 관련된

:

이 질문은 같은 라인을 따라입니다 :

...하지만 유일한 대답은 프록시에 대한 일부 매개 변수를 다루는 페이지에 대한 링크이지만 예제 또는 다른 유용한 힌트는 없습니다. 질문에에

...

는 실제로 다른 URL로 요청을 변경할 수있는 rewriteURI() 메소드를 오버라이드 (override) 부두의 ProxyServlet,의 확장을 만들었습니다. 이 사용자 정의 프록시는 Jetty가 내장되어있을 때 작동하지만 web.xml 파일과 jetty-maven-plugin을 사용하여 배포 할 전쟁을 만들면 더 이상 작동하지 않습니다.

요청을하면 응용 프로그램을 디버그하여 rewriteURI() 메서드에 들어가는 것을 볼 수 있습니다. 그러면 완료 될 때까지 실행되는 Jetty의 ProxyServlet의 service() 메서드가 호출되지만 아무 일도 일어나지 않습니다. 페이지는 하늘의 채로되어, 결국 ProxyServlet의 onResponseFailure()가 TimeoutException, "Total timeout elapsed"와 함께 호출됩니다. 개발 도구는 504 게이트웨이 시간 초과를 수신하는 요청을 표시합니다.

일이 연결되는 방식에 뭔가 빠져있는 것처럼 보이지만 그게 무엇인지 알 수는 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 아래에 web.xml과 맞춤 프록시 (ProxyServletExtension)를 포함 시켰습니다.

web.xml을

<servlet> 
    <servlet-name>proxy</servlet-name> 
    <servlet-class>org.example.ProxyServletExtension</servlet-class> 
    <init-param> 
     <param-name>maxThreads</param-name> 
     <param-value>1</param-value> 
    </init-param> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>proxy</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

ProxyServletExtension.java

... 
import org.eclipse.jetty.proxy.ProxyServlet; 
... 
public class ProxyServletExtension extends ProxyServlet { 
    @Override 
    protected URI rewriteURI(HttpServletRequest request) { 
     // Forward all requests to another port on this machine 
     String uri = "http://localhost:8060"; 

     // Take the current path and append it to the new url 
     String path = request.getRequestURI(); 
     uri += path; 

     // Add query params 
     String query = request.getQueryString(); 
     if (query != null && query.length() > 0) { 
      uri += "?" + query; 
     } 
     return URI.create(uri).normalize(); 
    } 
} 

답변

2

은 내가 jetty transparent proxy always returns 403 forbidden와 함께이 문제를 해결하는 데 필요한 힌트를 발견했다. 질문은 정확히 내 질문과 관련이 없지만 제공된 코드 조각은 <servlet>에 내가 필요한 것을 보여주었습니다. web.xml.

업데이트 web.xml을

<servlet> 
    <servlet-name>proxy</servlet-name> 
    <servlet-class>org.example.ProxyServletExtension$Transparent</servlet-class> 
    <init-param> 
     <param-name>maxThreads</param-name> 
     <param-value>1</param-value> 
    </init-param> 
    <init-param> 
     <param-name>proxyTo</param-name> 
     <param-value>http://localhost:8060</param-value> 
    </init-param> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>proxy</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

필수 설정

  1. 변화 <servlet-class>ProxyServletExtension$Transparent에, 이전에 내가 trasparent 프록시를 사용하지 않았다.
  2. <init-param>proxyTo 인 경우 요청을 프록시 할 주소를 사용하십시오.이는 위의 (질문에서) 위의 ProxyServletExtension.java 클래스가 완전히 불필요하다는 것을 의미합니다.

또한, 프록시가 요청을 프록시 전에 들어오는 요청의 일부를 제거 할 수있는뿐만 아니라 prefix<init-param> 있다는 것을 언급 할 가치가있다.

관련 문제