这是由浏览器缓存受限页面引起的。
容器管理的安全性将重定向到触发身份验证检查的最后一个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