Истечение срока действия IceFaces вызывает исключение - PullRequest
0 голосов
/ 08 апреля 2011

Мое приложение IceFaces падает по истечении сеанса.Он не отображает сообщение «Сеанс пользователя истек» или «Прервано сетевое соединение».

Я предполагаю, что та же страница загружается снова, и поскольку код компонента поддержки не может найти переменные сеанса, он выдает следующее исключение:

exception
javax.servlet.ServletException: java.lang.Exception: javax.faces.FacesException: Problem in renderResponse: /main-template.jspx: User session has expired or it was invalidated.

root cause
java.lang.Exception: javax.faces.FacesException: Problem in renderResponse: /main-template.jspx: User session has expired or it was invalidated.

root cause
javax.faces.FacesException: Problem in renderResponse: /main-template.jspx: User session has expired or it was invalidated.

root cause
javax.el.ELException: /main-template.jspx: User session has expired or it was invalidated.

root cause
com.icesoft.faces.webapp.http.core.SessionExpiredException: User session has expired or it was invalidated.

root cause
java.lang.IllegalStateException: PWC2778: getAttribute: Session already invalidated

Асинхронные обновления включены, а на странице jsp есть компонент <ice:outputConnectionStatus />.

Есть какие-нибудь идеи о том, как это предотвратить?

Примечание : я занимался многими причудливыми вещами, такими как перенаправление по тайм-ауту сеанса и отображение страниц ошибок дляjava.lang.Throwable, но я все это закомментировал - без везения.Когда и перенаправление, и обработка ошибок были включены, в первый раз приложение показывало страницу с ошибкой, а затем через некоторое время перенаправляло на страницу «истечение сеанса».

Спасибо

1 Ответ

1 голос
/ 12 апреля 2011

У меня была та же проблема с RichFaces, и этот ответ спас меня:

Время ожидания входа в систему jsf

Для большого количества поворотов и странностей, которые я рекомендуюсм. этот блог:

http://balusc.blogspot.com/

Вот код, который я сейчас использую:

package com.spectotechnologies.jsf.viewhandler;

import com.sun.facelets.FaceletViewHandler;
import java.io.IOException;
import javax.faces.application.ViewHandler;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

/**
 * Source : /158134/vremya-ozhidaniya-vhoda-v-jsf
 *
 * This ViewHandler is used to remove the ViewExpiredException problem at login
 * after the session is expired.
 *
 * @author Alexandre Lavoie
 */
public class AutoRegeneratorViewHandler extends FaceletViewHandler
{
    public AutoRegeneratorViewHandler(ViewHandler p_oViewHandler)
    {
        super(p_oViewHandler);
    }

    @Override
    public UIViewRoot restoreView(FacesContext p_oContext, String p_sViewID)
    {
        UIViewRoot oViewRoot = super.restoreView(p_oContext,p_sViewID);

        if(oViewRoot == null)
        {
            // Work around Facelet issue
            initialize(p_oContext);

            oViewRoot = super.createView(p_oContext,p_sViewID);
            p_oContext.setViewRoot(oViewRoot);

            try
            {
                buildView(p_oContext,oViewRoot);
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }

        return oViewRoot;
    }
}

Вы также должны поместить его в face-config.xml:

<application>
    <view-handler>com.spectotechnologies.jsf.viewhandler.AutoRegeneratorViewHandler</view-handler>
</application>
...