JSF: очищенный бин Soped Session - PullRequest
2 голосов
/ 18 января 2010

Мне было интересно, как бы я сделал session.remove("userBean") в JSF после того, как пользователь закроет окно (нажав «Х» браузера) на JSF 1.2.

Я думал добавить подтверждение после того, как пользователь нажмет «X» в браузере, но не совсем уверен, как мне получить доступ или привязать кнопку Ok к определенному методу, где у меня есть логика для очистки объекта EJB. , Или есть ли лучший способ сделать это?

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 4 ]

6 голосов
/ 18 января 2010

Мне было интересно, как бы я сделал session.remove ("userBean") в JSF после того, как пользователь закрывает окно (нажимая 'X' браузера) на JSF 1.2.

Тебе не нужно об этом беспокоиться. Если время сеанса истекло, боб обязательно будет удален. При необходимости вы можете контролировать период ожидания сеанса в <session-config> в web.xml. Если вы действительно хотите подключить тайм-аут / уничтожить сеанс, то вы можете просто реализовать HttpSessionListener и перехватить на sessionDestroyed(), или позволить UserBean внедрить HttpSessionBindingListener и перехват valueUnbound().

Если вы действительно настаиваете на прослушивании кнопки закрытия браузера, что, в конце концов, гораздо более трудоемко, то все, что вы можете сделать, - это использовать событие beforeunload Javascript. Других способов нет. Вам следует только помнить, что это нестандартное событие, и поэтому оно не поддерживается всеми веб-браузерами. Например. Opera не поддерживает это событие. Это довольно трудоемко, чтобы упростить это, потому что это событие также будет запускаться, когда вы выполняете простую ванильную навигацию или отправку формы, вам нужно подавлять это событие на каждой «обычной» ссылке / кнопке. Вам также нужно будет выполнить Ajaxical-запрос, чтобы сообщить серверу о закрытии, потому что вы больше не можете изменить местоположение страницы или отправить скрытую форму, так как браузер будет закрыт.

2 голосов
/ 18 января 2010

Вы можете использовать MyFaces Orchestra для определения ваших bean-компонентов в пользовательских conversation.access и conversation.manual. Они позволят удалять ваши компоненты более недавно, чем если бы они хранились в сеансе.

  • Вы можете определить время ожидания для разговора, которое отличается (и меньше) от времени ожидания сеанса.
  • если используется conversation.access, ваши бины будут удалены сразу после того, как на них больше не ссылается пользовательский запрос - то есть разговор завершен. Это не относится к вашему делу (закрытие браузера), но все же полезно знать.

Разговоры - это последовательности шагов, выполняемых пользователем, принадлежащими к одному и тому же логическому контексту, т. Е. Весь процесс регистрации представляет собой один разговор, хотя он занимает несколько страниц.

Как правило, вам не нужно беспокоиться о том, что остается в сеансе после того, как пользователь закрывает его. Это в конечном итоге будет отсчитано время и мусор. Вам нужно беспокоиться о том, что происходит в сеансе, пока он просматривает, потому что он может очень сильно увеличиться.

2 голосов
/ 18 января 2010

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

В случае, если вы хотите немедленно аннулировать сеанс.Вы всегда можете использовать функцию JavaScript для отправки запроса на ваш сервер, нажав на кнопку «ОК».Это, возможно, не очень надежная вещь, но не повредит как средство.Ниже приведен пример кода,

Функция JavaScript

function show_confirm()
{
  var r=confirm("Are you sure you want to abort the session?");
  if (r==true) {
    // set an appropriate form action and 
    document.form.submit();
  }
}

HTML

<input type="button" onclick="show_confirm()" value="Show confirm box" />

[Отредактированопосле ваших комментариев]

Итак, вы хотите привязать кнопку к вашему методу bean, вам нужно сделать что-то нестандартное, используя CSS и JavaScript.Посмотрите на этот урок , он даст вам некоторое представление о том, как вы будете создавать собственное всплывающее окно.Так как это просто обычный <div>, вы будете делать это так же, как любую другую кнопку, здесь нет науки о ракетах, просто поместите свой код кнопки внутри этого <div>.

1 голос
/ 18 января 2010

В JSF вы будете делать что-то вроде

Страница JSF:

<h:commandButton id="closeBtn"
      type="submit" value="Close" onclick="return showConfirmClose();" 
      actionListener="#{backBean.cleanUpMethod}"
</h:commandButton>

Javascript:

 //in case the user clicked No, this method should return false,
 //preventing the action from being submitted, but double check all the return values first 

 function showConfirmClose(){   
     var c = confirm("Are you sure?");
     return c;    
 }

BackBean:

public void cleanUpMethod(ActionEvent event){
      //do cleaning here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...