HttpServletRequest中的setAttribute()和HttpSession中的setAttribute()之间的区别是什么?他们在什么情况下使用?谢谢你的帮助!
答案 0 :(得分:19)
一个在请求范围中设置一个属性,另一个在会话范围中设置一个属性。主要区别在于范围的生命周期。请求范围在关联的响应完成时结束。当会话已被客户端或服务器超时时,会话范围结束。当作用域结束时,它的所有属性都将被删除,并且它们在不同的请求或会话中不可用。
您使用请求范围来存储特定于HTTP请求的数据(例如,基于特定请求的数据库结果,成功/错误消息等)。您可以使用会话范围来存储特定于HTTP会话的数据(例如,登录用户,用户设置等)。同一客户端的所有请求共享同一会话(因此,同一客户端会话中的所有不同浏览器选项卡/窗口将共享相同的服务器会话)。
答案 1 :(得分:2)
如果你使用httpServletRequest.setAttribute();那么属性将绑定到该请求对象,
而在httpServletSession.setAttribute();
中将绑定attr。在会议中。
因此,如果您希望该数据的范围使用session
,或者您只需要使用该数据的范围request
例如:
登录用户的UserName应在会话中共享,因此请将其保留在session
虽然,在考虑身份验证失败的情况下,您提供给用户的错误消息,仅在我们不需要之后才需要此请求,请将其保留在request
答案 2 :(得分:2)
在Request对象上设置属性时,该变量仅在请求范围内可用。该变量可以由您作为此请求的一部分转发的其他jsp /资源访问。
虽然在会话范围上设置属性将可用于用户会话中的所有请求(除非您从会话中删除它)。
因此,它归结的主要区别是属性的范围/寿命。
总是尝试使用请求范围变量,除非您需要在用户会话中使用它:例如用户角色。使用更多并发用户在会话上保留更多数据可能会导致内存不足问题。此外,如果您使用由数据库支持的会话共享(就像您在websphere中所做的那样),则会导致性能问题。