ServletResponse.reset() 是阻止未授权(注销)用户访问 servlet 的可行方法吗?
Posted
技术标签:
【中文标题】ServletResponse.reset() 是阻止未授权(注销)用户访问 servlet 的可行方法吗?【英文标题】:Is ServletResponse.reset() a viable way block unauthorized (logged-out) users from accessing servlets? 【发布时间】:2017-05-21 21:41:02 【问题描述】:我想知道ServletResponse.reset()
是否是我需要阻止未登录用户访问 servlet 的额外步骤,或者它是否存在风险或缺点。
背景:
my website 的工作方式最初是用户在创建帐户并使用这些凭据登录后才能看到某些页面。我最初遇到的问题是,即使我使用了session.invalidate()
,当用户注销时,他们也可以重新发送请求(例如,通过后退按钮)并且能够从未经授权的状态访问受限内容.假设会话已过期,如上所述,我不确定这是怎么可能的,或者可以采取哪些适当的措施来防止它。
通过实验,作为一种变通方法,我尝试了ServletResponse.reset()
,似乎解决了它,但我不明白它为什么有效,因此我不确定它是否有效一个稳健可行的解决方案。
我的具体问题是:
重置响应缓冲区(包括标头和 http 状态代码)是安全的还是推荐的做法,还是有更好的方法?
如何使用会话对象而不是使用会话 cookie 来管理登录?
【问题讨论】:
【参考方案1】:我不认为ServletResponse.reset()
会伤害任何东西,但它不是标准操作程序,也没有必要。只需确保您在使会话无效和验证会话方面都做正确的事情。
使会话无效:
调用session.invalidate()
删除绑定到会话的会话属性,但还要确保您的代码明确删除它自己对先前会话状态的陈旧引用。会话 cookie 可以通过使用完全匹配的条件定位 cookie 并将其最大年龄设置为 0 来显式删除。
验证会话:
认证时,可以查看getSession(false)
是否返回null来判断是否有活动会话。如果是这样,那么您可以使其无效,并且您可以也检查request.isRequestedSessionIdValid()
,或明确检查您在会话管理方案中使用的任何特定属性是否存在。这将让您正确验证会话的状态。
来自 JavaDocs:
ServletResponse
void reset()
清除缓冲区中存在的所有数据以及状态代码和标头。如果响应已 提交,此方法将引发 IllegalStateException。
void invalidate()
使此会话无效,然后解除绑定到它的所有对象。
ServletRequest
boolean isRequestedSessionIdValid()
检查请求的会话 ID 是否仍然有效。
HttpSession getSession(boolean create)
返回与此请求关联的当前 HttpSession,或者,如果没有当前会话并且 create is true, sup> 返回一个新会话。如果 create is false 并且请求没有有效的 HttpSession,则此方法返回 null。 要确保正确维护会话,您必须在提交响应之前调用此方法。 正在使用 cookie 来维护会话完整性,并在响应提交时被要求创建新会话 提交时,会引发 IllegalStateException。
【讨论】:
以上是关于ServletResponse.reset() 是阻止未授权(注销)用户访问 servlet 的可行方法吗?的主要内容,如果未能解决你的问题,请参考以下文章