我想知道ServletResponse.reset()
是否需要阻止非登录用户访问servlet,或者是否存在风险或缺点。
背景:
my website的工作方式,最初用户只有在创建帐户并使用这些凭据登录后才能看到某些页面。我最初遇到的问题是,即使我使用session.invalidate()
,当用户注销时,他们可以重新发送请求(例如,通过后退按钮)并且能够访问受限内容未经授权的州假设会话已经过期,如上所述,我不确定该怎么做甚至可以做些什么来阻止它。
通过实验,作为一种解决方法,我尝试ServletResponse.reset()
,并且似乎来解决它,但我不明白为什么它可行,因此,我&#39 ;我不相信这是一个强有力的可行解决方案。
我的具体问题是:
重置响应缓冲区(包括标题和http状态代码)是一种安全或推荐的做法,还是有更好的方法呢?
如何使用会话对象管理登录而不是使用会话cookie?
答案 0 :(得分:0)
我认为ServletResponse.reset()
不会伤害任何东西,但它不是标准的操作程序,它不应该是必要的。只要确保你正在做正确的事情,无效和验证会话。
会话无效:
session.invalidate()
删除绑定到会话的会话属性,但也要确保您的代码明确删除了它自己对先前会话状态的陈旧引用。通过使用完全匹配的条件查找cookie并将其最大年龄设置为0,可以明确删除会话cookie。验证会话:
getSession(false)
是否返回null以确定是否存在活动会话。如果是这样,您可以使其无效,并且您可以还检查request.isRequestedSessionIdValid()
,或者明确检查您在会话管理方案中使用的任何特定属性。这样可以让您正确验证会话状态。来自JavaDocs:
<强> ServletResponse的强>
void reset()
清除缓冲区中存在的所有数据以及状态代码和标头。如果响应是 committed,此方法抛出IllegalStateException。
void invalidate()
使此会话无效,然后取消绑定绑定到它的任何对象。
<强>的ServletRequest 强>
boolean isRequestedSessionIdValid()
检查所请求的会话ID是否仍然有效。
HttpSession getSession(布尔创建)
返回与此请求关联的当前HttpSession,如果没有当前会话且创建 true ,则返回 SUP>
返回一个新会话。如果 create false 且请求没有有效的HttpSession,则此方法返回null。
要确保正确维护会话,必须在提交响应之前调用此方法。
使用cookie来维护会话完整性,并在响应时被要求创建新会话 已提交,抛出IllegalStateException。