2013-01-03 27 views
3

我正在尝试将PrimeFaces添加到我的项目中。它使用基于表单的身份验证在Glassfish 3上运行。我下载了罐子并放入WEB-INF/lib。登录后,我被用URL CSS文件:PrimeFaces在Glassfish登录后重定向

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> 

谁能告诉我是什么问题?谢谢!

回答

2

您应该排除Web资源验证。在<security-constraint>元素中添加例如<url-pattern>*.css</url-pattern>。为所有不需要安全检查的网络资源(js,images,...)做到这一点。

+0

谢谢!这解决了这个问题。对不起,我不能投票。它说投票需要至少15个声望。对于stackoverflow仍然是新的。 – user996616

+0

所以,如果你是新的,只是检查这个答案。 – partlov

4

这是由浏览器缓存受限页面引起的。

容器管理的安全性将重定向到触发身份验证检查的最后一个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); 
    } 

    // ... 
} 

请注意,这也解决了“后退按钮”问题。因此,当您在当前设置中发生注销/注销后按下后退按钮时,最终用户也不会再看到受限制的页面。

+0

谢谢,BalusC!看起来我的问题是一个更简单的问题,虽然开始考虑它,但感觉奇怪的是为什么新添加的primefaces css文件而不是现有的文件被显示。现在,我们没有注销页面。但我会记住你的建议。 – user996616

+0

的确如此,但您仍然可以通过浏览器缓存访问受限制的资源。 – BalusC