ServletResponse.reset()是否可以阻止未经授权(已注销)的用户访问servlet?

时间:2017-01-07 02:56:01

标签: http servlets session-cookies servlet-filters session-state

我想知道ServletResponse.reset()是否需要阻止非登录用户访问servlet,或者是否存在风险或缺点。

背景:

my website的工作方式,最初用户只有在创建帐户并使用这些凭据登录后才能看到某些页面。我最初遇到的问题是,即使我使用session.invalidate(),当用户注销时,他们可以重新发送请求(例如,通过后退按钮)并且能够访问受限内容未经授权的州假设会话已经过期,如上所述,我不确定该怎么做甚至可以做些什么来阻止它。

通过实验,作为一种解决方法,我尝试ServletResponse.reset(),并且似乎来解决它,但我不明白为什么它可行,因此,我&#39 ;我不相信这是一个强有力的可行解决方案。

我的具体问题是:

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

  • 如何使用会话对象管理登录而不是使用会话cookie?

1 个答案:

答案 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。