0

この状況は、GAE にデプロイするときはよくありません。私のローカルでは問題なく動作します。わからないのは、GAE のみがクライアントにセッションを保存するためです。

さて、Google認証を使用した後、xhtmlページにリダイレクトされます. そこからバックビーンを呼び出し、条件に基づいて他のページにリダイレクトします。

<!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:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j">

<h:head>
    <script>
        function myfunc() {
            var buttonvar = document.getElementById("googleLoginForm:loginButton");
            buttonvar.click();
        }
    </script>
</h:head>
<body onload="myfunc()">
    Google account login success... please wait while processing your CEA account....
    <h:form rendered="true" id="googleLoginForm">
        <h:commandButton value="submit" id="loginButton" type="submit" immediate="true" style="visibility:hidden;"
            action="#{guestSupportBean.authenticationGoogle}">
            <f:param name="resultComponentId" value="googleLoginLink" />    
        </h:commandButton>
    </h:form>
</body>
</html>

戻り値がREQUEST_USER_PROFILES_SELECTIONの場合、これはfaces-configで正常に機能し、そのxhtml(googleIdLogin)に対して、userProfilesSelection.xhtmlにリダイレクトされます。そして #{userProfileSelectionBean.userProfiles} は、バック Bean アクション (#{guestSupportBean.authenticationGoogle}) 中に初期化されます。

<navigation-rule>
    <display-name>googleIdLogin</display-name>
    <from-view-id>/public/idm/googleIdLogin.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>REQUEST_USER_PROFILES_SELECTION</from-outcome>
        <to-view-id>/public/idm/userProfilesSelection.xhtml</to-view-id>
        <redirect />
    </navigation-case>
<navigation-rule>

userProfileSelection.xhtml は、ドロップダウン選択でユーザー プロファイルのリストを表示します。これはローカルでは正常に機能しますが、GAE にデプロイする場合は機能しません。

<rich:select id="userProfile" 
    value="#{userProfileSelectionBean.userProfileUid}"
    defaultLabel="#{msg.clickToSelect} #{msg.title}">
    <f:selectItems value="#{userProfileSelectionBean.userProfiles}" />
</rich:select>

<h:commandButton value="#{msg.selectUserProfile}" type="submit" 
    action="#{userProfileSelectionBean.selectUserProfile}">
</h:commandButton>

Bean の値を出力しようとしましたが、リダイレクト後に別の Bean を受け取ったように見えます。

うーん…フォワードを使って間接を取ったら。これで、 に値が設定されます。問題は、commonButton がバック Bean アクションへの呼び出しをトリガーしなかったことです (#{userProfileSelectionBean.selectUserProfile}".

ここに要約があります: - リダイレクトを使用する場合、値は取得されません - リダイレクトを使用しない場合、値を入力しますが、Bean Bean アクションはトリガーしません。

4

1 に答える 1

0

回避策が見つかりました...

userProfileSelectionBean.userProfiles を初期化した後、guestSupportBean.authenticationGoogle メソッド内で手動でセッションに何かを設定する必要があります。奇妙ですが、うまくいきます。

FacesContext.getCurrentInstance().getSessionMap().put("something", "some value");

于 2013-03-23T10:37:53.723 に答える