【问题标题】:Session handling in a Struts applicationStruts 应用程序中的会话处理
【发布时间】:2009-10-15 05:51:11
【问题描述】:

我在处理会话中的对象时遇到问题。

我像这样在会话中存储一个对象。假设 object 是对象的名称。我在我的行动课上这样做:

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 部分。我相信这是因为会话不是线程安全的。有什么解决办法吗?

【问题讨论】:

    标签: java jsp session struts struts-action


    【解决方案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,可能是应用程序范围!,取决于您对持久性的需要),并且需要使用用户在操作类中检索信息可以存储在会话、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
    }
    

    【讨论】:

      【解决方案2】:

      当您从不同的浏览器访问操作/页面时,您会创建一个新会话。在现代浏览器中,您可以在选项卡或视图之间共享会话。与更多浏览器共享会话的唯一方法是在 URL 中使用 jSessionid 参数。

      【讨论】:

      • 像一个真正的程序员一样说话 - 绝对正确但一点帮助都没有:-)
      • 我找到了问题所在。它是因为我在 excecute 方法之外声明了 HttpSession,这使得每个线程调用的 Session 都是全局的,因此问题。我已经纠正了它。
      猜你喜欢
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2013-01-20
      • 2011-07-26
      相关资源
      最近更新 更多