这是由浏览器缓存的受限页面引起的。
容器管理的安全性将重定向到触发身份验证检查的最后一个 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>
.
@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);
}
// ...
}
请注意,这也解决了“后退按钮”问题。因此,在注销/注销后按下后退按钮时,最终用户也不会再看到受限页面,这在您当前的设置中会发生。