質問

わかりました簡単な質問。ログインページを含むJSFアプリケーションがあります。問題は、ユーザーがログインページを読み込んでしばらくそのままにしてから、セッションにログインしようとすると期限切れになり、ViewExpiredExceptionがスローされることです。これが発生した場合、ログインにリダイレクトできますが、それはあまりスムーズではありません。追加の試行なしでこのフローが適切にログインできるようにするにはどうすればよいですか?

役に立ちましたか?

解決

更新

Mojarra 2.1.19 / 2.2.0以降、<f:view>のtransient属性をtrueに設定できるようになりました。

<f:view transient="true">
     Your regular content
</f:view>

Baluscのブログで次の記事を読むことができます:

http://balusc.blogspot.com.br/2013 /02/stateless-jsf.html

オリジナル

Faceletsを使用している場合、独自のViewHandlerを作成してこれを処理できます。

public class LoginViewHandler extends FaceletViewHandler
{
    public LoginViewHandler( ViewHandler viewHandler )
    {
        super( viewHandler );
    }

    @Override
    public UIViewRoot restoreView( FacesContext ctx, String viewId )
    {
        UIViewRoot viewRoot = super.restoreView( ctx, viewId );

        if ( viewRoot == null && viewId.equals( "/login.xhtml" ) )
        {
            // Work around Facelet issue
            initialize( ctx );

            viewRoot = super.createView( ctx, viewId );
            ctx.setViewRoot( viewRoot );

            try
            {
                buildView( ctx, viewRoot );
            }
            catch ( IOException e )
            {
                log.log( Level.SEVERE, "Error building view", e ); 
            }
        }

        return viewRoot;
    }
}

変更<!> quot; /login.xhtml <!> quot;ログインページへ。これは、ビューを復元できるかどうかを確認し、復元できない場合、および現在のビューがログインページである場合、ビューを作成して構築します。

これをface-config.xmlで次のように設定します。

<application>
    <!-- snip -->
    <view-handler>my.package.LoginViewHandler</view-handler>
</application>

Facelets(つまり、JSP)なしでJSFを使用している場合、ViewHandlerWrapperを拡張するクラスを使用してみてください-buildView()は利用できないことに注意してください。 createView()が単独で正しく設定されることを願っていますが、JSF / JSPについては100%確信が持てません。

他のヒント

ログインページがセッションスコープにあるように思えますが、実際には必要ありません。ログインページのリクエストスコープは適切である必要があります(現実には、ユーザーがログインする前にセッションに何も存在してはいけないため)。ユーザーがログインすると、この問題が再発する可能性がありますが、Phillのアイデアはそこから非常に優れています。

jspを使用すると、このディレクティブ<%@ page session="false" %>を含むページのセッションを無効にできます。 jsfにも同様のものが必要です。

わずかにハッキングされたソリューションのカップル:

  • (非常にハッキング)<meta http-equiv="refresh" content="5"/>タグを使用して、ページを頻繁に自動的にリロードします。
  • JavaScript関数を使用して定期的にサーバーに「ping」リクエストを送信し、セッションを維持します。

IceFaces を使用して、セッションの有効期限が切れたことを自動的に検出し、警告のポップアップを表示します事実に。ただし、何らかの理由でログインページで問題が発生することがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top