有没有办法找出http请求是否来自过期的网页

时间:2014-08-19 07:07:09

标签: java servlets request servlet-filters servlet-listeners

有没有办法找出http请求是否来自过期的网页(IE页面表示网页已过期)。我点击后退按钮即将到期网页。 现在在过期的页面上,我刷新/或F5,我想带一个特定页面上的用户,并显示错误消息。这个特定页面是我的主页,请求映射是/ homecontroller。 我试图使用过滤器来实现这一点,但我没有办法知道请求是来自过期页面还是登录页面。有人可以帮忙。

示例 - 假设有3页A(/ controllerA) - > B(/ controllerB) - > C(/ controllerC)。

  1. 现在,当我从第A页转到第B页时,我通过设置setCacheSeconds(0),setUseExpiresHeader(true),setUseCacheControlHeader(true),setUseCacheControlNoStore(true)来清除缓存。
  2. 现在我要从第B页开始翻页C.
  3. 现在,当我在第C页时,我点击了浏览器后退按钮,以便我可以返回到第B页
  4. 现在我没有获取页面B,而是获得IE浏览器的“网页已过期”消息页面
  5. 在上面的过期页面上,我刷新或F5。呼叫转到url(/ controllerB)
  6. 现在在(/ controllerB)的控制器中,我想检查此呼叫是否来自过期页面然后将此呼叫转发到/ controllerA,以便可以显示主页A.如果此呼叫不是来自过期页面,我想显示/ ControllerB
  7. 中的页面B.

2 个答案:

答案 0 :(得分:0)

当用户登录在会话属性

中设置该用户名或ID时,您可以使用会话来实现此目的
session.setAttribute("userid",  "21");

并在web.xml中保持会话超时

<session-config>
    <session-timeout>20</session-timeout>
</session-config>

当用户尝试访问过滤器中的页面时,尝试验证会话是否处于活动状态,这可以使用以下代码完成

session.getAttribute("userid");

如果上面的代码返回null而不是将用户重定向到登录页面,则允许访问您的类。如果session返回null,则表示会话已过期。

使会话无效

session.invalidate();

希望这会对你有所帮助。

答案 1 :(得分:0)

通常,您需要从页面B传递到页面C的某种token(参数)来验证请求是否已过期。
这将是建议流程:
  - 在从A转换为B时,您可以设置会话属性,例如&#39; expectedToken&#39; = n
  - 转换到C时的页面B,也发送此令牌(例如,通过GET中的请求参数,或者在POST中隐藏)
  - 控制器C,检查请求中的expectedToken是否与会话中的expectedToken相同,并在会话中增加{{1}}。如果请求中的令牌与会话中的令牌相同,则转换有效,如果令牌不匹配则从过期页面重新发送(因为浏览器将使用旧令牌值,并且您将在会话中增加一个)