2017-03-07 5 views
3

간단히 "Hello world"유형 서블릿이 있고 주석이 @WebServlet("/hello")으로 구성되어 있다고 가정 해 보겠습니다.빌드/패키지/배포에서 서블릿을 비활성화하고 런타임에 활성화 하시겠습니까?

빌드/배포를 위해 비활성화하려고하므로 서블릿을 "호출"할 수 없습니다. 내가 어떻게 그럴 수 있니? 이 클라이언트가 사용할 수 있도록

그런 다음, 구성 파일을 통해, 나는 런타임에서 서블릿 을 가능하게 할 수 있어야합니다. 내가 어떻게 그럴 수 있니?

이 중 하나가 가능합니까?

답변

7

표준 API를 통해 런타임 중에 서블릿을 활성화 할 수 없습니다. 대부분 빌드 시간 동안 web.xml 또는 배포 중에 ServletContext#addServlet()으로 만 사용할 수 있습니다. 최선의 방법은 항상 요청을 기반으로 사용하도록 설정하고 제어하는 ​​것입니다. 이 경우 servlet filter을 사용할 수 있습니다.

먼저 서블릿에 이름을 지정하십시오.

@WebServlet(urlPatterns="/hello", name="yourServlet") 
public class YourServlet extends HttpServlet { 
    // ... 
} 

서블릿의 URL 패턴에 대한 걱정없이 필터를 직접 매핑 할 수 있습니다.

@WebFilter(servletNames="yourServlet") 
public class YourFilter implements Filter { 
    // ... 
} 

필터에서 체인을 계속할지 또는 구성 파일 설정에 따라 404를 반환할지 결정하십시오.

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    if (isYourConfigurationFileSettingSet()) { 
     chain.doFilter(request, response); 
    } else { 
     ((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND); 
    } 
} 
isYourConfigurationFileSettingSet()

부분

지금까지 제공된 정보에 기초하여 상세하게 응답 할 수 없다. 실제로 그걸 알아낼 수없는 경우에는 Where to place and how to read configuration resource files in servlet based application?

1

서블릿을 주석으로 정의하는 대신 web.xml 파일에서 지정하십시오. 이 파일의 버전이 다르면 서블릿을 사용 가능하게 할 수도 있습니다.

사용할 web.xml의 버전은 빌드 및 배포시 선택해야합니다. 어쩌면 Maven 프로파일 또는 이와 유사한 것일 수도 있습니다. 그것에 대한 아이디어를 얻으려면 다음 링크를 살펴보십시오. https://maven.apache.org/guides/mini/guide-building-for-different-environments.html

+0

으로 머리를 맞 춥니 다. 제가 생각한 것은 틀림 없습니다 만, 패키징 할 때 여러 개의 'web.xml'파일 중 하나를 선택하기가 쉬우므로 기각 될 가능성이 있습니다. WAR 파일이지만 런타임에 선택할 수 있는지 또는 방법을 선택할 수 있는지 여부는 알 수 없습니다. –

+0

@Someprogrammerdude 제 편집을 참조하십시오. – Andres

1

진정한 런타임 컨트롤을 원한다면 약간의 사용자 정의 코딩을해야 할 수도 있습니다. 필터 (또는 아마도 서블릿 자체)는 속성 값을 검사하고 HTTP 오류 코드로 응답을 반환 할 수 있습니다 (403은 모호하고 적절하지만 404는 적지 만 생각하면 서블릿이 존재하지 않는다면 ...)