我正试图将PrimeFaces添加到我的项目。它运行在Glassfish 3
上,使用基于表单的身份验证。我下载了jar并放入WEB-INF/lib
。登录后,显示了一个css文件,URL为:
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>
谁能告诉我是什么问题?谢谢! 这是由于浏览器缓存的受限页面造成的。
容器管理安全性将重定向到触发身份验证检查的最后一个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);
}
// ...
}
注意,这也修复了"后退按钮"的问题。因此,当退出/注销后按下后退按钮时,最终用户也不会再看到受限制的页面,就像在当前设置中发生的那样。
你应该排除web资源验证。例如,在<security-constraint>
元素中添加<url-pattern>*.css</url-pattern>
。对于所有不需要安全检查的web资源(js, images,…),
看来你在安全约束中设置了错误的url模式。
看一下这个例子,看看它的工作版本。
http://blog.eisele.net/2011/01/jdbc-security-realm-and-form-based.html