我们的设置是一个部署了GWT应用程序的JBOSS wildfly应用服务器。我们使用基于表单的身份验证,并且为了测试超时,我已将web.xml中的会话超时更改为1分钟。
因此,我登录到应用程序并等待> 1分钟,然后执行我知道将触发RPC调用的操作,该调用将因会话已过期而失败。我们捕获异常并执行页面重新加载以触发登录表单。
如果我在登录表单出现后立即登录(或在1分钟内),我已成功登录到该应用程序。这种模式,只要我在意,我就可以继续。
但是如果我在登录表单出现后等待3-5分钟(在会话超时值之后),则浏览器将重定向到http://ourdomain/myapp/j_security_check
(当我查看firefox开发人员/网络时,状态码为200工具)。当我检查HTTP响应时,没有Location属性(通常有)。
谁能告诉我为什么会这样? j_security_check servlet是否有超时,用户需要在显示登录表单后x分钟登录并且是否连接到web.xml中的session-timeout?
答案 0 :(得分:2)
基于表单的身份验证使用会话并存储最初请求的" URL"在那届会议上。登录时,会从会话中读取URL并将其用作重定向的目标。所以如果你等了太长时间"在显示登录表单以使会话超时后,您刚刚丢失了该数据,并且服务器不知道将您重定向到哪里。
无论如何,这是如何在Servlets规范中定义基于表单的身份验证的缺陷(我从未想过它,所以感谢提出问题;-)),即使不使用相同的配置会话(规范并没有强制要求使用会话,尽管大多数 - 如果不是所有容器只使用会话),规范说(强调我的):
与安全约束关联的登录表单将发送到客户端和 触发身份验证的URL路径和HTTP协议方法由存储 容器。
[...]
如果身份验证成功,则使用存储将客户端重定向到资源 网址路径 [...]
如果由于HTTP请求而调用基于表单的登录,则为原始请求 参数必须由容器保留,以便在成功时使用 身份验证,它将调用重定向到请求的资源。
(注意:容器可能会在没有过期的情况下将信息存储在cookie中,然后这仍然可以工作,同时仍然遵循规范;容器开发人员在这么多年之后是不是太懒了?或者他们只是认为它不值得修理?)