Обработка сеанса в приложении Struts

Я столкнулся с проблемой обработки объекта в сеансе.

Я храню объект в сеансе, как это. Предположим, что объект — это имя объекта. Я делаю это в своем классе действий:

if(object!=null)
{
session.settAttribute("objectName",object);
return mapping.findForward("success");
}
else
{
return mapping.findForward("failure");
}

Я сопоставляю как успех, так и неудачу с одной и той же страницей jsp. я проверяю как

if(session.getAttribute("objectName")!=null)
    {
      object=  (SomeObjectClass)session.getAttribute("objectName");
    }
   if(object!=null)
   {
    //Do this
   }
   else
   {
    //Do that
   }

Теперь вот моя проблема. Нет проблем, когда я устанавливаю объект в первый раз в сеансе. У меня возникает проблема, когда я одновременно вызываю этот класс действий из двух разных браузеров. Я перехожу к части else для одного случая и части if для одного случая. Я считаю, что это связано с тем, что сеанс не является потокобезопасным. Есть ли решение?


person Harish    schedule 15.10.2009    source источник


Ответы (2)


Вы упомянули, что пытаетесь просмотреть одну и ту же информацию между двумя браузерами... если информация, которой вы пытаетесь поделиться, является "глобальной" (т.е. она должна быть одинаковой для ВСЕХ пользователей приложения, вы должны хранить информацию в области приложения, а не в области сеанса (см. http://java.sun.com/developer/onlineTraining/JSPIntro/contents.html#JSPIntro5 для объяснения областей действия). Например:

ServletContext servletContext = getServlet().getServletContext(); //"application scope"
SomeObjectClass object = (SomeObjectClass) servletContext.getAttribute("objectName");

if(object !=null){
  //Do this
} else {
  //Do that
}

Если у вас есть учетные записи и механизм входа в систему, и вы хотите, чтобы один и тот же логин отображал одну и ту же информацию в двух разных браузерах, тогда у вас другая проблема. В этом случае информацию необходимо будет хранить в «базе данных» (не обязательно в rdbms, это может быть область приложения!, в зависимости от ваших потребностей в постоянстве), и информацию необходимо будет получить в классе действий с помощью пользователя информация, которая может быть сохранена в сеансе, cookie и т. д.

//get the user info from the session, cookies, whatever
UserInfoObject userInfo = getUserInfo(request);
//get the object from the data store using the user info
SomeObjectClass object = getObjectForUser(userinfo);

if(object !=null){
  //Do this
} else {
  //Do that
}
person Michael Rush    schedule 29.12.2009

Когда вы получаете доступ к действию/странице из другого браузера, вы создаете новый сеанс. В современных браузерах вы можете разделить сеанс между вкладками или представлениями. Единственный способ поделиться сеансом с большим количеством браузеров — использовать параметр jSessionid в URL-адресах.

person cetnar    schedule 15.10.2009
comment
Говорю как настоящий программист - абсолютно правильно, но совсем не полезно :-) - person ChssPly76; 15.10.2009
comment
Я обнаружил, в чем проблема. Это потому, что я объявил HttpSession вне метода excecute, который делает сеанс глобальным для каждого вызова потока и, следовательно, проблему. Я исправил ее. - person Harish; 15.10.2009