2009-09-25 5 views
3

webapp 폴더 외부에있는 정적 HTML, imgs, 플래시 컨텐츠의 폴더가 있습니다. 지금은 그 폴더를 내 webapp 디렉토리에 매핑하는 심볼릭 링크를 사용하고 있습니다. 내가 가지고있는 문제는 심볼릭 링크를 따르고 모든 파일을 삭제하는 응용 프로그램 배포를 취소 할 때입니다.기본 서블릿을 감싸지 만 기본 webapp 경로를 덮어 씁니다.

구현하려고하는 솔루션 중 하나는 기본 서블릿을 래핑하지만 다른 상대 경로를 사용하는 특수 서블릿입니다. 기본 서블릿 경로를 덮어 쓰는 방식으로 기본 서블릿을 래핑하는 방법을 찾는 데 어려움을 겪고 있습니다. 좋은 생각이 아니다

public void doGet(final HttpServletRequest req, final HttpServletResponse resp) 
    throws ServletException, IOException { 
    final RequestDispatcher rd = getServletContext().getNamedDispatcher("default"); 
    final HttpServletRequest wrapped = new HttpServletRequestWrapper(req) { 

     @Override 
     public String getServletPath() { 
      return "/usr/depot/repository"; 
     } 
    }; 

    rd.forward(wrapped, resp); 
} 

답변

2

정적 컨텐츠를 제공하기 위해 서블릿을 작성할 수도 있고 (그다지 어렵지는 않음) 을 확장하여 DefaultServlet을 랩핑하려고 시도 할 수도 있습니다. 어느 쪽이든, 귀하의 결과 서블릿은 web.xml (서블릿 이름으로 "기본값"사용)에 기본값 대신 구성됩니다.

즉, DefaultServlet은 웹 응용 프로그램 컨텍스트 아래에서 정적 콘텐츠 만 제공합니다. 그것을 변경하기 위해서는 외부 폴더를 가리키는 자신의 ProxyDirContext 인스턴스를 JNDI에 생성/바인드해야하고 그것이 작동 할 지 확신 할 수 없다. 그 구성 과정이 복잡합니다.

서블릿 경로를 무시하려고 시도해도 아무데도 갈 수 없습니다.

0

: 여기

내가 함께 일하고 있어요 것입니다.

웹 컨테이너 또는 응용 프로그램 서버를 웹 서버 뒤에 배치하거나 단순히 컨테이너와 함께 웹 서버를 사용할 수 있습니다. 정적 파일을 그 아래에 놓고 절대 경로로 참조하십시오.

이런 종류의 해킹이 필요하지 않습니다 (미안하지만 그게 사실입니다).

웹 응용 프로그램으로 배포하거나 간단히 배포 할 수 있습니다.

+0

안타깝게도 콘텐츠는 보안 필터로 보호해야합니다. 우리는 이미 대부분의 정적 인 내용에 대해 아파치 httpd를 실행하고 있지만 그의 폴더는 특별하다. 나는 그것이 해킹에 동의합니다. – Ruggs

1

CMS에서 생성 된 일부 파일을 여러 응용 프로그램에서 공유해야하는 것과 비슷한 문제가 있습니다. Symlink는 Windows를 사용하지 않는 경우이 작업을 수행하는 가장 쉬운 방법입니다.

CMS와 Tomcat에 대해 2 개의 계정을 설정했습니다. 파일은 Tomcat으로 읽기 전용이므로 삭제할 수 없습니다.

작은 톰캣 확장을 작성하여 여러 위치에서 파일을 찾을 수도 있습니다.

http://blog.bazoud.com/post/2009/05/12/Multiples-docbases-avec-tomcat

현재 접근 방식은 작동하지 않습니다,이 웹 사이트를 참조하십시오. Tomcat은 배포 할 때 사용할 수 있도록 캐시의 모든 리소스를로드해야합니다. 요청 처리에서이를 변경하기에는 너무 늦었습니다. 이 확장을 통해 Tomcat은 여러 디렉토리에서 자원을로드 할 수 있습니다. 이 방법의 단점은 server/lib에 작은 JAR을 넣어야한다는 것입니다.

+0

나는 특정 경로에 매핑 된 내 자신의 serlvet을 만들기로 결정했다. 파일이 여러 앱 노드간에 공유되기 때문에 심볼릭 링크를 사용했지만 쓰기 가능해야합니다. 이것은 물론 이상적인 솔루션이 아니지만 요구 사항을 고려할 때 가장 좋습니다. – Ruggs

3

사용자 고유의 구현으로 DefaultServlet을 재정의 할 수 있습니다. 당신은 그것을 완벽하게 서브 클래스화할 수 있습니다. 이것은 공용 클래스입니다. Here이 DefaultServlet의 기능 사양이므로이를 준수해야합니다.

한편 DefaultServlet을 무시하고 자신의 솔루션으로 이동하면 here을 찾을 수 있습니다.

0

저는 임의의 기본 경로에서 파일을 제공하는 사용자 정의 서블릿을 오픈 소스했습니다. 또한 중첩 된 압축 아카이브 내에서 파일 탐색을 지원합니다.

이 여기에 사용할 수 : https://bitbucket.org/teslamotors/zip-listing/overview

+2

"이 저장소에 액세스 할 수 없습니다."라는 메시지가 나타납니다. –

0

당신은 당신의 웹 애플리케이션 컨텍스트 내에서 다른 경로로 변경할 수 있습니다. 그러나

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    RequestDispatcher rd = getServletContext().getNamedDispatcher("default"); 
    HttpServletRequest wrapped = new HttpServletRequestWrapper(req) { 
     @Override 
     public String getServletPath() { 
      String prefix = supportsES6(req) ? "/es6" : "/es5"; 
      String newPath = prefix + req.getServletPath(); 
      if (newPath.endsWith("/")) newPath += "index.html"; 
      return newPath; 
     } 
    }; 
    rd.forward(wrapped, resp); 
} 

, "ES5"와 "ES6를"우리는 초기 슬래시를 사용하는 웹 애플리케이션의 일반적인 상황의 하위 디렉토리에도 불구하고 다음은 차동 ES6 클라이언트의 사용자 에이전트가 지원하는지 여부에 따라 역할을 수행 예입니다 . 이 방법을 사용하여 컨텍스트 디렉토리 외부로 벗어나는 것은 불가능합니다.

관련 문제