不使用cookie的Spring Security会话

时间:2014-09-10 03:09:33

标签: java spring spring-security session-cookies

我正在使用SpringMVC从我们尝试连接的机器接收HTTP请求。来自机器的XML数据写在HTTP请求主体中。基本上,

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo version="2.0" xmlns="http://www.example.com/ns">
    <Bar sessionId="2" />
    <Baz quux="Monitor" seq="123">
       ...
    </Baz>
</Foo>

机器没有,也无法保留cookie。所以我无法通过JSESSIONID使用会话数据。我只有在Bar中找到的sessionId。我的系统应该在第一次请求时授予此sessionId。也就是说,

第1步:机器向我发送会话请求

步骤2:Web应用程序创建会话,然后向机器发送会话类型响应,然后在后续请求中保存并使用该响应。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo version="2.0" xmlns="http://www.example.com/ns">
    <Bar sessionId="2" />
    <Session quux="Monitor" seq="123">
       ...
    </Session>
</Foo>

步骤3:机器和Web应用程序之间的通信现在使用sessionId。

问题:

  1. Spring Security是否可以根据sessionId为会话分配会话?在这种情况下,XML中的sessionId就像cookie JSESSIONID一样。我是否可以配置Spring Security,以便从XML而不是HTTP标头或URL中检索sessionID?
  2. 我想知道其他系统是否存在此类问题以及我可以谷歌更多地研究这类问题。

1 个答案:

答案 0 :(得分:8)

您正在寻找的东西当然是可能的。 HTTP会话只是一个容器,用于在请求之间存储Spring Security身份验证令牌。您正在寻找的是在请求之间存储令牌并可靠地为每个请求检索令牌的地方。

在请求之间保存令牌的组件是org.springframework.security.web.context.SecurityContextRepository的实现。 Spring Security提供的一个现成实现使用HTTP Session作为令牌的存储区域。

类似地,在每个请求上检查令牌的组件是org.springframework.security.authentication.AuthenticationProvider的实现。至少,您需要实现这两个实现,以便在HTTP会话之外的每个请求上强制执行自定义策略来存储和检查身份验证令牌。

您可以查看my sample app以获取基于REST的应用程序的此策略的工作示例。我建议您在HTTP标头而不是请求正文中传递会话信息。它将减少您的实施工作并显着简化解决方案。