我们的设置是部署了GWT应用程序的JBOSS通配符应用程序服务器。我们使用基于表单的auth,为了测试超时,我将web.xml中的会话超时更改为1分钟。
因此,我登录到应用程序并等待>1分钟,然后执行我知道将触发RPC调用的操作,由于会话过期,RPC调用将失败。我们捕获异常并执行页面重新加载以触发要显示的登录表单。
如果我在登录表单出现后立即登录(或在1分钟内),我将成功地登录回应用程序。这种模式,我可以一直坚持下去,只要我在乎。
但是,如果在登录表单出现后等待3-5分钟(在会话超时值之后),浏览器将被重定向到http://ourdomain/myapp/j_security_check (当我查看firefox /network时,状态代码为200 )。当我检查HTTP响应时,没有Location属性(通常是这样的)。
有人能告诉我这是为什么吗?j_security_check servlet是否有超时,用户需要在显示登录表单后的x分钟登录,并且它是否连接到web.xml中的会话超时?
发布于 2014-09-19 08:55:30
基于表单的身份验证使用会话并在该会话中存储“最初请求的URL”。当您登录时,URL将从会话中读取,并用作重定向的目标。因此,如果在显示登录表单后等待“太久”,以致会话超时,则您刚刚丢失了该数据,而服务器不知道将您重定向到何处。
无论如何,在Servlet规范中如何定义基于表单的身份验证(我从未考虑过,因此感谢您问了这个问题;-)这是一个缺陷,即使没有使用与会话相同的配置(规范没有强制使用会话,尽管大多数-if不是所有容器只使用会话),规范说(强调我的):
与安全约束相关联的登录表单被发送到客户端,触发身份验证的URL路径和HTTP协议方法是容器存储的。 … 如果身份验证成功,则使用存储URL路径将客户端重定向到资源。 … 如果基于表单的登录由于HTTP请求而被调用,则容器必须保留原始请求参数,以便在成功身份验证时将调用重定向到请求的资源。
(注意:容器可能会在没有过期的情况下将信息存储在cookie中,这样就可以了,同时仍然遵循规范;容器开发人员在这么多年之后是不是太懒了?或者他们只是觉得不值得修理?)
https://stackoverflow.com/questions/25929546
复制相似问题