3

WebアプリでPrimeFaces3.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 / imageファイルなどのJSFリソースへのリクエストを開始し、それらをログインページにもリダイレクトする場合に発生する可能性があります。次に、Webブラウザーは、具体的なリソースではなく、ログインページのHTML表現を取得します。Webブラウザの開発者ツールセットでHTTPトラフィックを調査した場合は、それに気付くはずです。

サーブレットフィルタで自家製認証を使用している場合は、ログインページにリダイレクトせず、続行するようにフィルタに指示する必要があります。それはそれらの/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に追加する必要があります。

<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のようなサードパーティの認証フレームワークを使用している場合は、次のように伝える必要があります(3.1.0以降を想定)

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

SpringSecurity3.0.5も参照してください。

または、PicketLinkを使用している場合は、PrimetFacesベースのアプリケーションとPicketLinkがログインページにスタイルを表示しないを参照してください。

于 2012-12-11T15:35:38.537 に答える