2017-03-07 4 views
3

単純な「Hello world」型のサーブレットがあり、注釈@WebServlet("/hello")で構成されているとします。build/package/deployでサーブレットを無効にし、実行時に有効にしますか?

ビルド/デプロイ時に無効にしたいので、サーブレットを "呼び出す"ことはできません。どうすればいい?

は次に、コンフィギュレーションファイルを介して、私はそれは、クライアントが使用できるように、実行時でサーブレットを有効にすることができるようにしたいです。どうすればいい?

いずれかが可能ですか?

答えて

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以下ですが、サーブレットは存在しませんでした...)

関連する問題