为什么在我登录之前创建了新会话?

Rog*_*ger 1 java session spring tomcat spring-security

我创建了一个使用Spring Security(3.2)登录提示的Web应用程序.我在Tomcat 7中运行应用程序.我使用Tomcat管理器来监视会话.它是一个使用Vaadin servlet的Vaadin应用程序.没有使用JSP页面.

现在...

  1. 我有一个新开始的Tomcat,刚刚部署了.war.
  2. 我打开一个网络浏览器并输入该应用程序的网址,然后按回车键即可登陆该应用程序的登录页面.
  3. 我可以在Tomcat管理器中看到已经创建了1个会话.请注意,我还没有尝试过登录.
  4. 我关闭应用程序浏览器选项卡和浏览器本身并重新打开它(即有效删除任何会话数据)并再次输入URL并按Enter键.
  5. 我可以在Tomcat管理器中看到已经创建了另一个会话.现在总共有2个会话.请注意,我还没有尝试过登录.

这是预期的行为(防止某种会话固定攻击)还是我只是配置错误?

Mar*_*mas 6

简短版本是使用登录页面的登录进程需要创建会话以存储目标页面.

较长的版本是登录过程(假设成功的身份验证)将是这样的:

  1. 用户代理请求/ some/secure/page
  2. 容器检查经过身份验证的用户
  3. 用户未经过身份验证,因此容器启动登录过程
  4. Container创建会话
  5. Container将目标页面URL(/ some/secure/page)添加到会话
  6. 容器将用户重定向到登录页面
  7. 用户登录
  8. 容器验证凭据
  9. 容器更改会话ID(以防止会话固定)
  10. Container从会话中获取目标页面URL
  11. 容器将用户重定向到目标页面
  12. 用户代理请求目标页面
  13. 容器检查经过身份验证的用户
  14. 用户已通过身份验证,因此容器显示请求的页

如果没有会话,容器无法跟踪用户要求进行身份验证的页面(可能很多),因此在身份验证完成后无法将它们重定向到请求的页面.