3

我在我的 web 应用程序中使用 PrimeFaces 3.4,对于特定页面,控件不会显示为正常的 PrimeFaces 皮肤:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>VMS login</title>
</h:head> 
<h:body> 
  <h:form id="loginForm">
    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" />  
    <p:panel header="#{msgs['login.title']}">
      <p:panelGrid id="loginPanel" columns="2">
        <h:outputText value="#{msgs['login.username']}" />
        <p:inputText id="j_username" value="#{loginFormBean.userName}" required="true"></p:inputText>
        <p:message for="j_username" ></p:message>
        <h:outputText value="#{msgs['login.password']}" />
        <p:password id="j_password" value="#{loginFormBean.password}" required="true" feedback="false"></p:password>
        <p:message for="j_password"></p:message>
        <p:commandButton action="#{loginController.loginUsingSpringAuthenticationManager}" value="#{msgs['login.button']}" update="loginForm" ajax="true"></p:commandButton>
      </p:panelGrid>
    </p:panel>
  </h:form>
</h:body>
</html>

这输出到:

在此处输入图像描述

面板应该有一个标题等等。

有趣的是,在另一个页面中,我<p:layout>在布局中使用了不同的面板,它们以正常的 PrimeFaces 外观显示得很好。

我究竟做错了什么?谢谢

4

1 回答 1

5

鉴于它只发生在登录页面上,当身份验证机制还启动对 CSS/JS/图像文件等 JSF 资源的请求并将它们也重定向到登录页面时,就会发生这种情况。然后,网络浏览器将检索登录页面的 HTML 表示,而不是具体资源。如果您在 webbrowser 的开发人员工具集中调查过 HTTP 流量,那么您也应该注意到这一点。

如果您使用带有 servlet 过滤器的本地身份验证,那么您需要告诉过滤器不要将它们重定向到登录页面,而只是继续它们。就是那些/javax.faces.resource/*URL(您可以通过 将 URL 路径设为常量ResourceHandler#RESOURCE_IDENTIFIER)。

if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
    return;
}

// ...

或者,如果您使用的是容器管理的身份验证,那么您应该添加/javax.faces.resource/*到允许的 URL,这些 URL 应该从登录检查中跳过:

<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>

另请参阅在 web.xml 安全约束中排除 css 和图像资源

或者当您使用像 Spring Security 这样的 3rd 方身份验证框架时,您需要通过以下方式告诉它(假设 3.1.0 或更高版本)

<http security="none" pattern="/javax.faces.resource/**" />

另请参阅Spring Security 3.0.5

或者,当您使用 PicketLink 时,请参阅基于 PrimeFaces 的应用程序 with PicketLink does not show style in login page

于 2012-12-11T15:35:38.537 回答