2017-03-07 35 views
3

可以說我有一個簡單的「Hello world」類型的servlet,配置了註釋@WebServlet("/hello")在build/package/deploy中禁用servlet,在運行時啓用?

我想禁用它的構建/部署,所以它不可能「調用」該servlet。我會怎麼做?

然後,通過一個配置文件,我希望能夠在運行時使servlet的,因此它可以被客戶端使用。我會怎麼做?

是這些可能嗎?

回答

7

您無法在運行時通過標準API啓用servlet。它最多隻能在編譯時間web.xml或部署時間期間由ServletContext#addServlet()啓用。您最好的選擇是始終啓用它並根據每個請求進行控制。你可以用這個servlet filter

首先給servlet一個名字。

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

因此,您可以輕鬆地將過濾器直接映射到它,而無需擔心servlet的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

不是通過註釋定義servlet,而是在web.xml文件中執行。此文件的不同版本可能允許您啓用或不啓用servlet。

要在構建和部署時選擇要使用的web.xml版本。也許通過Maven配置文件或類似的。看看下面的鏈接有關的一些想法:https://maven.apache.org/guides/mini/guide-building-for-different-environments.html

+0

這絕對是我考慮過的一種可能性,但是因爲在封裝時很容易選擇多個'web.xml'文件中的一個, WAR文件,但我不知道是否可以在運行時或如何進行選擇。 –

+0

@Someprogrammerdude請參閱我的編輯。 – Andres

1

如果你想要真正的運行時控制,那麼你可能需要做一點自定義編碼。一個過濾器(或者我猜想,servlet本身)可以檢查一個屬性的值並返回一個帶有HTTP錯誤代碼的響應(我想403會是模糊的; 404更不會這樣,但是如果你想讓它看起來像該servlet不存在於該配置中,它將工作...)