2013-02-26 123 views
4

正在處理JSF 2項目之後呈現樣式表。我定義我的login.xhtml頁面的入口頁面在web.xml登錄頁面不會在過濾器

<welcome-file-list> 
     <welcome-file>login.xhtml</welcome-file> 
    </welcome-file-list> 

而且我也有一個過濾器來檢查,如果用戶登錄

@WebFilter(filterName = "loginCheckFilter", urlPatterns={"/*"}) 
    public class LoginCheckFilter implements Filter 
    { 
     @Inject 
     private LoginStatus loginStatus; 

     public void do Filter(...) 
     { 
      try{ 
      HttpServletRequest req = (HttpServletRequest) request; 
      HttpServletResponse res = (HttpServletResponse) response; 

      String path = req.getRequestURI(); 
      if(StringUtils.isNotBlank(path) 
       && StringUtils.contains(path, ".xhtml") 
       && !StringUtils.endsWith(path, "login.xhtml")) 
      { 
        if(loginStatus == null 
         || !loginStatus.isLoggedIn()) 
        { 
          res.sendRedirect(req.getContextPath() + "/login.xhtml"); 
         } 
        else 
         { 
          chain.doFilter(request, response); 
         } 
       } 
       else 
       { 
        chain.doFilter(request, response); 
       } 
      }catch (Exception ex) 
      { 
        log.error(ex); 
       } 
      } 

     .... .... 
     } 

我的CSS文件在以下被引用風格:

<link href="css/styles.css" rel="stylesheet" type="text/css"/> 

一切工作順利,直到我更改CSS引用樣式到JSF 2資源處理程序(http://www.mkyong.com/jsf2/resources-library-in-jsf-2-0/)。我已將所有css文件複製到資源文件夾下,並提供了庫名稱和版本號。因此,現在我參考如下的css:

<h:outputStylesheet library="default" name="css/styles.css"/> 

更改後,login.xhtml不再呈現樣式表。我在login.xhtml頁面後面有一個welcome.xhtml頁面,除了核心內容外,它的結構幾乎完全相同,但是這個頁面完全沒問題。我刷新了login.xhtml,但它仍未呈現。但是一旦我登錄後,進入下一頁,然後返回到login.xhtml,然後刷新,風格將得到呈現。另外,如果我取消loginCheckFilter,login.xhtml將呈現樣式表。那麼如果有人遇到類似的情況,並知道如何解決它?謝謝!

回答

5
urlPatterns={"/*"} 

您的過濾器還阻止對JSF資源的請求。

您需要以允許JSF資源請求的方式重寫過濾器。

@Override 
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {  
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    String loginURL = request.getContextPath() + "/login.xhtml"; 

    boolean loggedIn = loginStatus != null && loginStatus.isLoggedIn(); 
    boolean loginRequest = request.getRequestURI().startsWith(loginURL); 
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + "/faces" + ResourceHandler.RESOURCE_IDENTIFIER); 

    if (loggedIn || loginRequest || resourceRequest)) { 
     if (!resourceRequest) { // Prevent restricted pages from being cached. 
      response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      response.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } else { 
     response.sendRedirect(loginURL); 
    } 
} 
+0

它的工作原理。非常感謝! – chaoshangfei 2013-02-27 22:49:20

+0

不客氣。 – BalusC 2013-02-27 23:41:30

+0

@BalusC我愛你,你是個好人。 – Foriger 2015-01-29 21:40:40