2011-07-11 6 views
0

私はいくつかの提案が必要です。サーブレットマッピングを定義しましたサーブレット+リダイレクト

<servlet-mapping> 
<servlet-name>My Servlet</servlet-name> 
<url-pattern>/</url-pattern> 
</servlet-mapping> 

静的なHTMLファイルがあります。だから私は、静的なHTMLファイルに

<servlet-mapping> 
<servlet-name>default</servlet-name> 
<url-pattern>*.html</url-pattern> 
</servlet-mapping> 

を提供するために、デフォルトのサーブレットにそれらをマッピングしているしかし、私は、ユーザがログインしたときのみ、それらへのアクセスを持っていると思います。ウェルカムページがlogin.htmlとあります。ユーザーが他の静的ファイルにアクセスしようとしていてログインしていない、つまりセッションがない場合、ユーザーをログインページにリダイレクトする必要があります。しかし、現在のマッピングでは、リクエストはデフォルトのサーブレットによって提供されるため、ユーザーはindex.htmlファイルにアクセスできます。

お勧めします。

答えて

1

あなたの目的は、フロントコントローラサーブレットを用意し、デフォルトのサーブレットを置き換えることではありません。実際にフロントコントローラサーブレットを/にマッピングする必要はありません。

より具体的なURLパターン(たとえば、/app/*)にコントローラサーブレットをマップする必要があります。 URLを透過的に保つには、リクエストURIを決定し、HTMLのような静的コンテンツの連鎖を継続し、残りをコントローラサーブレットにディスパッチするフィルタを作成することが最善の方法です。

など。

String uri = request.getRequestURI(); 

if (uri.endsWith(".html")) { 
    chain.doFilter(request, response); 
} else { 
    request.getRequestDispatcher("/app" + uri).forward(request, response); 
} 
0

WebサーバーのDefaultServletを拡張することができます。拡張サーブレットはフロントコントローラになります。 doGETメソッドまたはdoPOSTメソッドで、静的ページをスーパークラスに転送します。 DefaultServletは、デフォルトでurl "/"にマップされるサーブレットです。私はjettyサーバーと一緒に使ってきましたが、Tomcatでも実装できます。

public class FrontController extends DefaultServlet { 

@Override 
public void init() throws UnavailableException { 
    super.init(); 
} 

@Override 
protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    String uri = request.getRequestURI(); 

    /* 
    * if request is trying to access inside /static then use the default 
    * servlet. YOU CAN USE YOUR OWN BUSINESS LOGIC TO FORWARD REQUESTS 
    * TO DEFAULTSERVLET 
    */ 
    if (uri.startsWith("/static/")) { 

     super.doGet(request, response); 
     return; 
    } else { 

     // else use your custom action handlers 
    } 
    } 
} 

上記のコードサンプルでは、​​/ static /で始まるすべてのリクエストを処理するデフォルトのサーブレットに転送しました。このようにして、FrontControllerを「/」レベルにマップすることができます。

<servlet> 
<description></description> 
<display-name>FrontController</display-name> 
<servlet-name>FrontController</servlet-name> 
<servlet-class>FrontController</servlet-class> 
<servlet-mapping> 
<servlet-name>FrontController</servlet-name> 
<url-pattern>/</url-pattern>