2009-10-15 4 views
0

У меня возникла проблема с обработкой объекта в сеансе.Обработка сеанса в приложении 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 
    } 

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

ответ

0

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

+0

Владеет, как истинный программист - абсолютно правильно, но не совсем help :-) – ChssPly76

+0

Я исправлю себя через минуту :) – cetnar

+0

Я нашел, в чем проблема. Потому что я объявил HttpSession вне метода excecute, который делает Session Global для каждого вызова потока и, следовательно, проблемы. Я исправил Это. – Harish

1

Вы упомянули, что пытаетесь увидеть одну и ту же информацию между двумя браузерами ... если информация, которую вы пытаетесь предоставить, является глобальной (т.е. она должна быть одинаковой для ВСЕХ пользователей приложения, вы следует хранить информацию в области приложения, а не область сеанса (см 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, может быть областью приложения!), в зависимости от вашей роли DS для персистенции) и информация должны быть получены в классе действий, используя информацию о пользователях, которые могут быть сохранены в сессии, печенье и т.д.

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