我遇到了一个代码,其中会话对象以两种不同的方式获得(或者以两种不同的方式写入)。
使用HttpServletRequest
someMethod(HttpServletRequest request){
HttpSession session = request.getSession();
//getAttribute from session
}
使用HttpSession
anotherMethod(HttpSession session){
//getAttribute from session
}
我在SO上经历了此article和question。但我仍有一些疑问。
有人可以帮我理解这些之间的区别吗?
更新
这两个都是spring控制器中的方法,它们映射到不同的ajax调用。我知道有一个与每个请求对象相关联的会话,但是当你传递一个HttpSession对象时,它会在哪里找到当前的会话对象(加载所有属性)或者它是如何获得的?当我从javascript调用该方法时,我根本没有传递任何东西。
答案 0 :(得分: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
传递给其他类的方法。
答案 1 :(得分:0)
如果您有单个属性,则不需要浮动会话对象。只需使用会话对象即可访问它。
HttpSession session = request.getSession(true);
session.getAttribute(name);
现在只有在你可以浮动session
个对象的合理情况下,你有大量的属性,并且你希望每个方法都能访问它自己的一组属性。在任何情况下,该方法都依赖于传递给它的session
,所以它不应该关心它是如何获得的。
答案 2 :(得分:0)
这两者之间没有太大的区别,如果多次调用可以使用第二种方法来消除一个额外的方法调用request.getSession()
,方法是保持会话有点像本地缓存(除非调用100s,否则可以忽略性能提升)时间)。
例如
HttpSession session=request.getSession();
getFirstAttr(session);
getSecondAttr(session);
....
getHundredthAttr(session);
如果您使用第一种方法,则会调用该方法称为额外request.getSession()
的所有时间。