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

时间:2014-03-19 13:35:14

标签: java spring session tomcat spring-security

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

现在...

  1. 我有一个刚刚启动的Tomcat,刚刚部署了.war。
  2. 我打开网页浏览器并输入应用程序的网址,然后按回车键,这会让我登录该应用程序的登录页面。
  3. 我可以在Tomcat管理器中看到已经创建了1个会话。请注意,我还没有尝试登录。
  4. 我关闭应用浏览器标签和浏览器本身并重新打开它(即有效删除任何会话数据)并再次输入网址并按Enter键。
  5. 我可以在Tomcat管理器中看到已经创建了另一个会话。现在总共有2个会话。请注意,我仍然没有尝试登录。
  6. 这是预期的行为(防止某种会话固定攻击)还是我只是配置错误?

2 个答案:

答案 0 :(得分:6)

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

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

  1. 用户代理请求/ some / secure / page
  2. 对经过身份验证的用户进行容器检查
  3. 用户未经过身份验证,因此容器启动登录过程
  4. Container创建会话
  5. Container将目标网页网址(/ some / secure / page)添加到会话
  6. 容器将用户重定向到登录页面
  7. 用户登录
  8. 容器验证凭据
  9. 容器更改会话ID(以防止会话固定)
  10. Container从会话中获取目标网页网址
  11. 容器将用户重定向到目标页面
  12. 用户代理请求目标页面
  13. 对经过身份验证的用户进行容器检查
  14. 用户已通过身份验证,因此容器会显示请求的页面
  15. 如果没有会话,容器无法跟踪需要用户请求身份验证的页面(可能很多),因此在身份验证完成后无法将它们重定向到请求的页面。

答案 1 :(得分:1)

会话与spring-security没有直接关系,尽管spring-security可以创建它。会话由第一个getSession()上的servlet容器创建。可以是spring-security或在第一个请求期间运行的任何其他代码,并调用getSession()。

尽管如此,如果您担心,Spring-security可以配置为在您进行身份验证时用“新鲜”替换第一个会话。更多信息here

我希望我帮助你澄清一些事情。