2008-10-23 1 views
4

OK простой вопрос. У меня есть приложение JSF, содержащее страницу входа. Проблема заключается в том, что пользователь загружает страницу входа в систему, оставляет ее на некоторое время, затем пытается войти в сеанс, и истекает исключение ViewExpiredException. Я могу перенаправить обратно в логин, когда это произойдет, но это не очень гладко. Как я могу позволить этому потоку правильно войти без дополнительной попытки?jsf логин-аут

ответ

6

Update

По Mojarra 2.1.19/2.2.0 теперь вы можете установить переходный атрибут <f:view> истина:

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

Вы можете прочитать в блоге на Balusc's здесь :

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

Оригинал

Если вы используете Facelets вы можете создать свой собственный обработки просмотров справиться с этим:

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; 
    } 
} 

Изменить «/login.xhtml» на странице входа в систему. Это проверяет, может ли он восстановить ваше представление, а если он не может, и текущее представление является вашей страницей входа в систему, оно создаст и построит представление для вас.

Установить это в лицо-config.xml следующим образом:

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

Если вы используете JSF без Facelets (т.е. JSPs), вы можете попробовать, имеющие класс продлить ViewHandlerWrapper - обратите внимание, что buildView() будет не будут доступны. Надеюсь, что createView() на нем будет правильно настроен, но я не уверен на 100% с JSF/JSP.

+0

Любая идея, как это сделать в JSF 2? – 2012-08-22 00:49:56

0

Пара немного Hacky решений:

  • (Очень Hacky) использовать <meta http-equiv="refresh" content="5"/> тег автоматически перезагрузить страницу каждый так часто.
  • Используйте функцию JavaScript, чтобы периодически отправлять запрос «ping» на сервер, чтобы сохранить сеанс в активном режиме.

Мы используем IceFaces на работе, которая автоматически обнаруживает, когда истек срок вашей сессии, и отображает всплывающее предупреждение о факте. Но по некоторым причинам у нас по-прежнему возникают проблемы на странице входа в систему.

0

Похоже, что ваша страница входа в сеансовую область, когда это действительно не обязательно. Область запроса должна быть прекрасной для страницы входа (так как, как правило, не должно быть ничего в сеансе до входа пользователя в систему). Как только пользователь войдет в систему, у вас может возникнуть эта проблема, но идеи Филла очень хороши.

0

С помощью jsp вы можете отключить сеанс для страницы, включая эту директиву <%@ page session="false" %>. Для jsf должно быть что-то похожее.

Смежные вопросы