2013-01-03 30 views
3

我正在嘗試將PrimeFaces添加到我的項目中。它使用基於表單的身份驗證在Glassfish 3上運行。我下載了罐子並放入WEB-INF/lib。登錄後,我被用URL CSS文件:PrimeFaces在Glassfish登錄後重定向

localhost:8080/[webapp]/javax.faces.resource/theme.css.jsf?ln=primefaces-aristo

如果我禁用安全檢查這不會發生。這是我的web.xml中的登錄部分。

<login-config> 
    <auth-method>FORM</auth-method> 
    <form-login-config> 
     <form-login-page>/login.jsf</form-login-page> 
     <form-error-page>/login.jsf?failed=true</form-error-page> 
    </form-login-config> 
</login-config> 

誰能告訴我是什麼問題?謝謝!

回答

2

您應該排除Web資源驗證。在<security-constraint>元素中添加例如<url-pattern>*.css</url-pattern>。爲所有不需要安全檢查的網絡資源(js,images,...)做到這一點。

+0

謝謝!這解決了這個問題。對不起,我不能投票。它說投票需要至少15個聲望。對於stackoverflow仍然是新的。 – user996616

+0

所以,如果你是新的,只是檢查這個答案。 – partlov

4

這是由瀏覽器緩存受限頁面引起的。

容器管理的安全性將重定向到觸發身份驗證檢查的最後一個HTTP請求。在你的情況下,它顯然是自動包含的PrimeFaces主題CSS文件。如果瀏覽器從瀏覽器緩存中完全加載待認證頁面,而瀏覽器已經從服務器端完全加載CSS文件,或者通過條件GET請求測試了CSS文件的緩存有效性。然後容器管理的安全性會準確記住這個URL爲重定向後成功登錄的URL。

你想排除的JSF資源(<h:outputScript>,從認證檢查<h:outputStylesheet><h:graphicImage>。你可以做到這一點通過排除常見的URL模式/javax.faces.resource/*

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Allowed resources</web-resource-name> 
     <url-pattern>/javax.faces.resource/*</url-pattern> 
    </web-resource-collection> 
    <!-- No Auth Contraint! --> 
</security-constraint> 

需要指示瀏覽器至而不是緩存受限頁面以防止瀏覽器從緩存中加載它(例如,通過在註銷後按下退出按鈕)。使用與<security-constraint>相同的URL模式映射以下過濾器。

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint> 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse res = (HttpServletResponse) response; 

     if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      res.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      res.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 

請注意,這也解決了「後退按鈕」問題。因此,當您在當前設置中發生註銷/註銷後按下後退按鈕時,最終用戶也不會再看到受限制的頁面。

+0

謝謝,BalusC!看起來我的問題是一個更簡單的問題,雖然開始考慮它,但感覺奇怪的是爲什麼新添加的primefaces css文件而不是現有的文件被顯示。現在,我們沒有註銷頁面。但我會記住你的建議。 – user996616

+0

的確如此,但您仍然可以通過瀏覽器緩存訪問受限制的資源。 – BalusC