2009-07-01 22 views
2

我使用調用RequestDispatcher.forward環

<url-pattern>/*</url-pattern> 

所有請求一個sevlet,在那裏我做所有的工作認證映射。 但我想跳過一些靜態內容(如CSS文件)。所以我試圖從 該sevlet到fowrding他們在資源文件是

if(isResourceFile){ 
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("static/" + fileName); 
    dispatcher.forward(request, response); 
} 

但這將啓動一個無限循環,因爲這會再次調用相同的sevlet

有沒有什麼辦法可以解決這個問題,而無需映射web.xml中的所有資源(css)文件?

回答

0

假設你正在尋找驗證只是JSP文件,你可以改變的網址:

/*.jsp 

我認爲這是一個更好的主意,使用過濾器,而不是一個servlet來處理您的身份驗證。在生產環境中,您應該使用前端Web服務器來處理靜態內容。

+0

感謝您的回覆如此之快。我打算不要在URL中使用.jsp後綴。我會嘗試使用過濾器。 – Manu 2009-07-01 14:55:31

0

如果你不能在映射使用過濾器,你必須使用通配符「*」不喜歡「的.jsp」一個擴展,然後那麼這可能爲你工作:

if(isResourceFile){ 
     RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/static/" + fileName); 
     dispatcher.forward(request, response); 
     return; 
} 

添加「 /'在靜態目錄的開始會給它根上下文。

1

/*url-pattern最好只用於Filter s,而不是Servlet s。把所有的靜態文件放在一個特定的文件夾中(也許覆蓋url-pattern更有效的FileServlet?),讓過濾器檢查它。

E.g. (僞)

public void doFilter(request, response, chain) { 
    if (requestURI.startsWith("/static")) { 
     chain.doFilter(request, response); // Just continue. Do nothing. 
    } else { 
     request.getRequestDispatcher("/pages").forward(request, response); // Forward to page controller. 
    } 
} 

希望這會有所幫助。