java中的会话 - 任何最佳实践?

时间:2012-09-27 06:17:04

标签: java spring session spring-mvc

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

使用HttpServletRequest

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

使用HttpSession

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

我在SO上经历了此articlequestion。但我仍有一些疑问。

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

更新

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

3 个答案:

答案 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()的所有时间。