這是由瀏覽器緩存受限頁面引起的。
容器管理的安全性將重定向到觸發身份驗證檢查的最後一個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);
}
// ...
}
請注意,這也解決了「後退按鈕」問題。因此,當您在當前設置中發生註銷/註銷後按下後退按鈕時,最終用戶也不會再看到受限制的頁面。
謝謝!這解決了這個問題。對不起,我不能投票。它說投票需要至少15個聲望。對於stackoverflow仍然是新的。 – user996616
所以,如果你是新的,只是檢查這個答案。 – partlov