Jsf Glassfish登录后PrimeFaces重定向

Jsf Glassfish登录后PrimeFaces重定向,jsf,primefaces,glassfish,Jsf,Primefaces,Glassfish,我正在尝试将PrimeFaces添加到我的项目中。它使用基于表单的身份验证在Glassfish 3上运行。我下载了jar并将其放入WEB-INF/lib。登录后,我看到一个带有URL的css文件: localhost:8080/[webapp]/javax.faces.resource/theme.css.jsf?ln=primefaces-aristo 如果禁用安全检查,则不会发生这种情况。这是my web.xml中的登录部分 <login-config> <auth

我正在尝试将PrimeFaces添加到我的项目中。它使用基于表单的身份验证在Glassfish 3上运行。我下载了jar并将其放入
WEB-INF/lib
。登录后,我看到一个带有URL的css文件:

localhost:8080/[webapp]/javax.faces.resource/theme.css.jsf?ln=primefaces-aristo

如果禁用安全检查,则不会发生这种情况。这是my 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>

形式
/login.jsf
/login.jsf?failed=true

谁能告诉我出了什么问题?谢谢

您的安全约束中似乎有错误的url模式

看看这个示例,了解一个工作版本


您应该从验证中排除web资源。在
元素中添加例如
*.css
。对所有不需要安全检查的web资源(js、图像等)执行此操作。

这是由浏览器缓存的受限页面造成的

容器管理的安全性将重定向到触发身份验证检查的最后一个HTTP请求。在您的例子中,它显然是自动包含的PrimeFaces主题CSS文件。如果浏览器已从浏览器缓存中完全加载待验证页面,而浏览器已从服务器端完全加载CSS文件,或已通过条件GET请求测试CSS文件的缓存有效性,则可能发生这种情况。容器管理的安全性将在成功登录URL后准确地将此URL作为重定向记住

您想从身份验证检查中排除JSF资源(
),可以通过排除公共URL模式
/javax.faces.resource/*
来实现


允许的资源
/javax.faces.resource/*
还需要指示浏览器不要缓存受限制的页面,以防止浏览器从缓存中加载页面(例如,注销后按后退按钮)。将以下过滤器映射到与您的
相同的URL模式上

@WebFilter(“/secured/*”)//使用与相同的URL模式
公共类NoCacheFilter实现过滤器{
@凌驾
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
HttpServletRequest req=(HttpServletRequest)请求;
HttpServletResponse res=(HttpServletResponse)响应;
如果(!req.getRequestURI().startsWith(req.getContextPath()+ResourceHandler.RESOURCE_IDENTIFIER)){//跳过JSF资源(CSS/JS/Images/etc)
res.setHeader(“缓存控制”,“无缓存,无存储,必须重新验证”);//HTTP 1.1。
res.setHeader(“Pragma”,“无缓存”);//HTTP 1.0。
res.setDateHeader(“Expires”,0);//代理。
}
链式过滤器(请求、响应);
}
// ...
}

请注意,这也修复了“后退按钮”问题。因此,最终用户在注销/注销后按“后退”按钮时也不会再看到受限制的页面,就像您当前的设置一样。

谢谢!这解决了问题。很抱歉,我无法投票。它说投票至少需要15个声誉。仍然是stackoverflow的新手。因此,如果您是新用户,请检查此作为答案。谢谢,BalusC!我的问题似乎更简单,尽管仔细想想,为什么会显示新添加的primefaces css文件,而不是现有的文件,感觉很奇怪。现在,我们没有注销页面。但我会记住你的建议。是的,但你仍然会通过浏览器访问受限的资源缓存。这是一篇很棒的文章!然而,我们这里的项目是一个遗留项目。转移到基于jdbc的安全性有点晚。不过非常有用的信息。
@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);
    }

    // ...
}