2

私のWebアプリでは、セッションが期限切れになり、ユーザーがリクエスト(フルページまたはAJAX)を開始すると、ユーザーはセッションが期限切れになったというメッセージとともにログインページにリダイレクトされます。問題は、セッションが期限切れになるのに十分な時間ログインページを開いたままにして、ユーザーがログインしようとすると、セッションが期限切れになったというメッセージとともにユーザーがログインページにリダイレクトされることです。

このソリューションに出くわしましたが、これはJSF 1.x用であり、JSF 2では機能しません。そこで、独自のソリューションを構築し始めました。

public class LoginViewHandler extends ViewHandler
{
    public LoginViewHandler(ViewHandler parent)
    {
        this.parent = parent;
    }

    @Override
    public Locale calculateLocale(FacesContext context)
    {
        return parent.calculateLocale(context);
    }

    @Override
    public String calculateRenderKitId(FacesContext context)
    {
        return parent.calculateRenderKitId(context);
    }

    @Override
    public UIViewRoot createView(FacesContext context, String viewId)
    {
        return parent.createView(context, viewId);
    }

    @Override
    public String getActionURL(FacesContext context, String viewId)
    {
        return parent.getActionURL(context, viewId);
    }

    @Override
    public String getResourceURL(FacesContext context, String path)
    {
        return parent.getResourceURL(context, path);
    }

    @Override
    public void renderView(FacesContext context, UIViewRoot viewToRender)
            throws IOException, FacesException
    {
        parent.renderView(context, viewToRender);
    }

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

        if (viewRoot == null && viewId.equals("/login.xhtml"))
        {
            parent.initView(context);

            viewRoot = parent.createView(context, viewId);
            context.setViewRoot(viewRoot);

            try
            {
                buildView(context, viewRoot); // Compile error!
            }
            catch (IOException e)
            {
                log.log(Level.SEVERE, "Error building view", e); 
            }
        }

        return viewRoot;
    }

    @Override
    public void writeState(FacesContext context) throws IOException
    {
        parent.writeState(context);
    }

    private ViewHandler parent;
}

ただし、と呼ばれるメソッドはありませんbuildView。それが何をするのか、なぜそれが必要なのか、そして何に置き換えるべきなのかわかりません。何か案は?

4

1 に答える 1

0

ViewDeclarationLanguage#buildView()このステップは、使用されているビューテクノロジ(Facelets、JSP、JavaVDLなど)から切り離されているため、に移動されました。

context.getApplication().getViewHandler()
    .getViewDeclarationLanguage(context, viewId).buildView(context, viewRoot);

ViewHandlerWrapperちなみに、代わりに拡張する方が簡単です。このように、デリゲートメソッドのその束は必要ありません。

于 2012-08-22T01:53:16.257 に答える