8

個人のユーザー名とパスワードを認証するためのユーザーBeanがあるログインページがあります。このBeanはセッションスコープです。誰かがURLを書き込んでログインページにジャンプしようとした場合、それを確認してログインページにリダイレクトするにはどうすればよいですか?

一方で。ログインして作業していて、突然しばらく外出してセッションが期限切れになったとします。戻ってフォームを操作しようとすると、セッションの有効期限を警告するメッセージが送信されます。これが発生した場合、どうすればログインフォームに再度リダイレクトできますか?

前もって感謝します。私が自分自身を説明することを望みます。

Mojarra 2.1.4、Tomcat 7、Tomahawk 1.1.11

4

2 に答える 2

17

誰かがURLを書き込んでログインページにジャンプしようとした場合、それを確認してログインページにリダイレクトするにはどうすればよいですか?

自家製の認証を使用しているようです。その場合、サーブレットフィルタを実装する必要があります。JSFは、セッションスコープのマネージドBeanをの属性として格納するため、メソッドHttpSessionで確認できます。doFilter()

HttpServletRequest req = (HttpServletRequest) request;
UserManager userManager = (UserManager) req.getSession().getAttribute("userManager");

if (userManager != null && userManager.isLoggedIn()) {
    chain.doFilter(request, response);
} else {
    HttpServletResponse res = (HttpServletResponse) response;
    res.sendRedirect(req.getContextPath() + "/login.xhtml");
}

このフィルターを、保護されたページをカバーするURLパターンにマップします/app/*


戻ってフォームを操作しようとすると、セッションの有効期限を警告するメッセージが送信されます。これが発生した場合、どうすればログインフォームに再度リダイレクトできますか?

これがAjaxリクエストに関係していることを理解していますか?<error-page>通常のリクエストでは、 inを使用できますweb.xmlweb.xml次のようにクライアントに状態保存方法を設定する場合

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

オプションではない場合は、カスタムを実装する必要がありますExceptionHandler

public class ViewExpiredExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public void handle() throws FacesException {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
            Throwable exception = iter.next().getContext().getException();

            if (exception instanceof ViewExpiredException) {
                facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, "viewexpired");
                facesContext.renderResponse();
                iter.remove();
            }
        }

        getWrapped().handle();
    }

    @Override
    public ExceptionHandler getWrapped() {
        return wrapped;
    }

}

(この特定の例はに移動するviewexpiredため、/viewexpired.xhtmlエラーページとして表示されることに注意してください)

上記は、次のExceptionHandlerFactory実装によってベイク処理する必要があります。

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new ViewExpiredExceptionHandler(parent.getExceptionHandler());
    }

}

faces-config.xml次に、次のように登録する必要があります。

<factory>
    <exception-handler-factory>com.example.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
于 2011-11-15T23:05:57.220 に答える
2

独自のシステムを実装している場合は、セッションなどと呼ばれる属性をユーザーに追加できます。この属性はブール値にすることができるため、セッションが開始するたびにこの属性をtrueに設定できます。たとえば、 permissionというメソッドを記述します。

public void permission() throws IOException {

        if(userStatelessBean.getSession() == false) {
            System.out.println("*** The user has no permission to visit this page. *** ");
            ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
            context.redirect("login.xhtml");
        } else {
            System.out.println("*** The session is still active. User is logged in. *** ");
        }
    }

制限が必要な各jsfページ(この例では)で、ページの最初に次のコードを追加できます。

<f:metadata>
     <f:event type="preRenderView" listener="#{sesija.permission()}"/>
</f:metadata>

これにより、ページをレンダリングする前にオブジェクト名sesijaでJSF ManagedBeanを呼び出し、指定されたメソッドで作成したルールが満たされているかどうかを確認します。

これがお役に立てば幸いです。

ありがとうございました。

于 2014-11-11T17:03:18.553 に答える