jsfログインがタイムアウトします
-
04-07-2019 - |
質問
わかりました簡単な質問。ログインページを含む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 を使用して、セッションの有効期限が切れたことを自動的に検出し、警告のポップアップを表示します事実に。ただし、何らかの理由でログインページで問題が発生することがあります。