2012-10-07 1 views
4

부두에서 (임베디드), DynamicHandler를 사용하여 동적 요청에 응답하는 정적 파일과 커스텀 핸들러를 제공하려고한다.Jetty에서 ResourceHandler와 커스텀 핸들러를 사용할 때 루트 요청에서 403을 얻는다.

public static void main(String[] args) throws Exception 
{ 
    Server server = new Server(); 
    SelectChannelConnector connector = new SelectChannelConnector(); 
    connector.setPort(8080); 
    server.addConnector(connector); 

    ResourceHandler resource_handler = new ResourceHandler(); 
    resource_handler.setDirectoriesListed(false); 

    resource_handler.setResourceBase("."); 

    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] { resource_handler, new MyHandler() }); 
    server.setHandler(handlers); 

    server.start(); 
    server.join(); 
} 

이가가 올바르게 의미에서 작동합니다 :

  • 이/공공/스타일처럼, 내 공개 디렉토리에있는 파일에서 정적 컨텐츠를 역할 this page을 바탕으로 나는이처럼 보이는 설정을 가지고 .CSS
  • /foo는/바

문제를 같이 공공 디렉토리에 존재하지 않는 경로에

  • 런가 MyHandler 내가 루트 팻에 대한 응답으로 403을 얻을 수 있다는 것입니다 h (/)이다. MyHandler는 이러한 요청에 응답 할 수 있지만 먼저 ResourceHandler에 의해 인터셉트됩니다. Jetty가 MyHandler에 요청/전송하도록 강제 할 수있는 방법이 있습니까?

    미리 감사드립니다.

  • 답변

    3

    Jetty는 핸들러 중 하나가 요청시 setHandled (true)를 호출 할 때까지 각 Handler를 순차적으로 시도합니다. ResourceHandler가 "/"에 대해이 작업을 수행하지 않는 이유는 확실하지 않습니다.

    내 솔루션은 처리기를 나열하는 순서를 반대로하여 사용자가 먼저 호출하도록했습니다. 그런 다음 URL에서 특수 사례 "/"를 확인하십시오. 요청을 ResourceHandler에 전달하려면 처리 된 것으로 요청을 선언하지 않고 간단히 리턴하십시오.

    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 
    { 
        if(!request.getRequestURI().equals("/")){ 
         return; 
        } 
        // Do Stuff... 
        baseRequest.setHandled(true); 
        return; 
    } 
    

    을 내가 "/"는 ResourceHandler 단순히 양보해야하는 가장 우아한 것 동의

    Server server = new Server(8080); 
    
    CustomHandler default = new CustomHandler(); 
    default.setServer(server); 
    
    ResourceHandler files = new ResourceHandler(); 
    files.setServer(server); 
    files.setResourceBase("./path/to/resources"); 
    
    HandlerList handlers = new HandlerList(); 
    handlers.setHandlers(new Handler[] {default, files}); 
    
    server.setHandler(handlers); 
    
    server.start(); 
    server.join(); 
    

    을 그리고이 같은 CustomHandler의 핸들 방법을 정의

    는 다음과 같이 핸들러의 순서를 선언 응답을 처리하는 대신 403.

    +0

    고맙습니다 :) 저는 Gradle을 기반으로 한 전쟁 기반 웹 응용 프로그램 개발 환경을 가지고 재사용 가능한 플러그인을 개발하고 있습니다. 여기서 설명하는 해결 방법과 유사한 해결 방법을 구현하게되었습니다. https://github.com/augustl/gradle-warlike-plugin/blob/365d056952c1a627fc37a350bcee1d9d03ffce56/src/main/groovy/com/augustl/gradle/warlike/WarlikeServer.groovy#L50 –

    1

    내 솔루션 :

    • MyHandler를 "/"와는 다른 컨텍스트 경로에 놓습니다. "/ 지수는"
    • 통화에 "/"를 차단하기 위해 재 작성 규칙을 사용하는 "/ 인덱스"

    내가 사용하는 코드는 다음과 같습니다 리디렉션 :

    RewriteHandler rewriteHandler = new RewriteHandler(); 
    rewriteHandler.setRewriteRequestURI(true); 
    rewriteHandler.setRewritePathInfo(false); 
    rewriteHandler.setOriginalPathAttribute("requestedPath"); 
    RewriteRegexRule rewriteIndex = new RewriteRegexRule(); 
    rewriteIndex.setRegex("^/$"); 
    rewriteIndex.setReplacement("/index.html"); 
    rewriteHandler.addRule(rewriteIndex); 
    rewriteHandler.setHandler(rootHandlerCollection); 
    server.setHandler(rewriteHandler); 
    

    정규식 보장하지만 정확한 경로 만 일치 시켜서, "/ 무엇이든지"여전히 ResourceHandler에 의해 처음 처리됩니다.