2011-07-11 93 views
0

我需要一些建議。我定義了servlet映射爲Servlet +重定向

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

但是有一些靜態html文件。所以我把它們映射到默認servlet來服務於靜態HTML文件

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

但是,我希望用戶擁有對它們的訪問只有當用戶已經登錄,歡迎頁面的login.html。如果用戶試圖訪問任何其他靜態文件並且沒有登錄,即沒有會話,那麼我應該將用戶重定向到登錄頁面。但是通過當前的映射,用戶可以訪問index.html文件,因爲請求由默認的servlet提供。

請建議。

回答

1

您的意圖是擁有一個前端控制器servlet,而不是替換默認的servlet。所以你實際上不應該在/上映射你的前端控制器servlet。

您應該將控制器servlet映射到更具體的URL模式,例如/app/*。爲了保持URL透明,最好的辦法是創建一個過濾器,它確定請求的URI並繼續鏈接靜態內容(如HTML),並將剩餘部分分發給控制器servlet。

E.g.

String uri = request.getRequestURI(); 

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

您可以擴展Web服務器的DefaultServlet。擴展的servlet將成爲您的前端控制器。在doGET或doPOST方法中,將靜態頁面轉發給超類。 DefaultServlet是默認映射到url「/」的servlet。我用它與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 /開頭的請求轉發到要處理的缺省servlet。通過這種方式,您可以將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>