0

我遇到了一个代码,其中会话对象以两种不同的方式获得(或者更确切地说以两种不同的方式编写)。

使用HttpServletRequest

 someMethod(HttpServletRequest request){
 HttpSession session = request.getSession();
 //getAttribute from session
 }

并使用HttpSession

anotherMethod(HttpSession session){
//getAttribute from session
}

我浏览了这篇文章和一个关于 SO的问题。但我仍然有一些疑问。

有人可以帮我理解这些之间有什么区别吗?

更新

这两个都是 spring 控制器中的方法,它们被映射到不同的 ajax 调用。我知道每个请求对象都有一个会话,但是当您传递一个 HttpSession 对象时,它在哪里找到当前会话对象(加载所有属性)或者它是如何获得的?当我从 javascript 调用该方法时,我根本没有传递任何东西。

4

3 回答 3

1
someMethod(HttpServletRequest request)

在此您正在传递当前request对象,您可以从中获取您的current session,然后您可以从中获取属性。您可以使用以下方法从您的请求对象中获取当前会话对象:-

request.getSession(false)

*注意: - 我们false作为参数传递getSession(false)以获取任何现有会话。如果不存在会话,它将返回null.. 然而,request.getSession()将始终创建一个新会话,因此您不会在其他会话中获得任何 prevoius 属性存储。

anotherMethod(HttpSession session)

在这里,您session从某处传递对象本身。可能是因为,您的session对象包含许多属性,并且您不希望方法中有很多参数。

但是您应该在您的所有这些session相关任务中完成Servlet并将其传递attribute给其他类的方法..

于 2012-09-27T06:25:47.157 回答
0

如果您有单个属性,则不需要浮动会话对象。只需简单地使用会话对象访问它。

HttpSession session = request.getSession(true);
session.getAttribute(name);

现在,您可以浮动对象的唯一明智情况session是您拥有大量属性,并且您希望每个方法都访问自己的一组属性。在任何情况下,该方法都取决于session传递给它,因此它不应该关心它是如何获得的。

于 2012-09-27T06:29:19.507 回答
0

这两者之间没有太大区别,如果多次调用第二种方法,则可以使用第二种方法,request.getSession()通过保持会话有点像本地缓存来消除一个额外的方法调用(除非调用 100 次,否则性能提升可忽略不计)。

例如,。

HttpSession session=request.getSession();
getFirstAttr(session);
getSecondAttr(session);
....
getHundredthAttr(session);

如果您使用第一种方法,则该方法被调用的所有时间都会调用一个额外的方法request.getSession()

于 2012-09-27T06:39:37.613 回答