Glassfish登录后,PrimeFaces重定向



我正试图将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

相关内容

  • 没有找到相关文章

最新更新