Http ServletResponse.reset()是阻止未经授权(注销)用户访问servlet的可行方法吗?

Http ServletResponse.reset()是阻止未经授权(注销)用户访问servlet的可行方法吗?,http,servlets,session-cookies,servlet-filters,session-state,Http,Servlets,Session Cookies,Servlet Filters,Session State,我想知道ServletResponse.reset()是否是阻止未登录用户访问servlet的额外步骤,或者是否存在风险或缺点 背景: 按照这种方式,最初用户只能在创建帐户并使用这些凭据登录后才能看到某些页面。我最初遇到的问题是,即使我使用了session.invalidate(),当用户注销时,他们可以重新发送请求(例如,通过“后退”按钮),并且能够从未经授权的状态访问受限内容。假设会话已过期,如上所述,我甚至不确定这是怎么可能的,或者可以采取什么适当的措施来防止它 通过实验,作为一种解决方法

我想知道
ServletResponse.reset()
是否是阻止未登录用户访问servlet的额外步骤,或者是否存在风险或缺点

背景:

按照这种方式,最初用户只能在创建帐户并使用这些凭据登录后才能看到某些页面。我最初遇到的问题是,即使我使用了
session.invalidate()
,当用户注销时,他们可以重新发送请求(例如,通过“后退”按钮),并且能够从未经授权的状态访问受限内容。假设会话已过期,如上所述,我甚至不确定这是怎么可能的,或者可以采取什么适当的措施来防止它

通过实验,作为一种解决方法,我尝试了
ServletResponse.reset()
,这似乎解决了问题,但我不明白它为什么会起作用,因此,我不相信它是一个可靠可行的解决方案

我的具体问题是:

  • 重置响应缓冲区(包括标头和http状态代码)是安全的还是推荐的做法,还是有更好的方法

  • 与使用会话cookie相比,如何管理使用会话对象登录


我不认为
ServletResponse.reset()
会伤害任何东西,但它不是标准操作程序,也不应该是必要的。只需确保在失效和验证会话时都做了正确的事情

使会话无效:

  • 调用
    session.invalidate()
    以删除绑定到会话的会话属性,但也要确保代码明确删除了它自己对上一个会话状态的陈旧引用。通过使用精确匹配条件定位cookie并将其最大期限设置为0,可以显式删除会话cookie
正在验证会话:

  • 进行身份验证时,可以检查
    getSession(false)
    是否返回null以确定是否存在活动会话。如果是这样,则可以使其无效,还可以检查
    request.isRequestedSessionIdValid()
    ,或者明确检查会话管理方案中使用的任何特定属性是否存在。这将允许您正确验证会话的状态
从JavaDocs:

ServletResponse

无效重置()

清除缓冲区中存在的所有数据以及状态代码和标头。如果回答是正确的 如果已提交,此方法将抛出非法状态异常

void invalidate()

使该会话无效,然后解除绑定到该会话的所有对象

ServletRequest

布尔isRequestedSessionIdValid()

检查请求的会话ID是否仍然有效

HttpSession getSession(布尔创建)

返回与此请求相关联的当前HttpSession,或者,如果没有当前会话且create为true
返回一个新会话。如果create为false且请求没有有效的HttpSession,则此方法返回null
要确保会话得到正确维护,必须在提交响应之前调用此方法
正在使用Cookie来维护会话完整性,并在响应失败时被要求创建新会话 如果已提交,则抛出非法状态异常