如何使用基于Spring的应用程序使用jsessionid URL参数

时间:2012-02-20 12:00:02

标签: java spring session spring-security sessionid

我们有REST API的应用程序。它基于Spring,也使用了Spring安全性。 例如,我们配置了一些基于角色的限制:

<sec:http auto-config="true" access-decision-manager-ref="accessDecisionManager">
    <sec:intercept-url pattern="/auth/authenticate" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <sec:intercept-url pattern="/auth/logout" access="IS_AUTHENTICATED_FULLY"/>
    <sec:intercept-url pattern="/users/**" access="USER"/>
</sec:http>    

它适用于cookie,但现在我们需要启用将jsessionid作为URL参数而不是cookie传递的可能性。我认为我们不需要在代码中更改任何内容,但出现问题。 我请求/登录方法并从响应中复制jsessionid。之后我尝试请求 / users; jsessionid = * 并获得401状态代码,这意味着应用程序无法识别我。为了使这种方法有效,我们应该改变什么?

1 个答案:

答案 0 :(得分:2)

通常,基于cookie的身份验证系统不适用于基于XML的API(如SOAP和REST)。实践是在每个API调用上进行身份验证。

在同一论坛中查看this帖子。引用帖子:

  

REST服务通常在每个请求上进行身份验证,   通常不会通过会议。

现在的原因是

  • 这些类型的xml基础API的客户端或使用者不是浏览器,而是其他应用程序。
  • 浏览器了解Cookie,实际上Cookie是针对基于浏览器的用户而不是针对一般应用程序的。
  • 客户可能会或可能不会理解cookie,并且在大多数情况下都不会理解,因为Cookie不是这些类型API的身份验证的标准方法。

除了以非标准cookie方式处理此方法之外,还有更好的方法。不确定您使用的是哪个版本的spring-security,HERE是用于保护RESTful应用程序的spring-security 3.1的示例。

编辑:

结帐this link。这迫使tomcat(不确定你是否使用tomcat)不使用cookie处理会话。但是一旦完成,这将不会处理基于cookie的会话。我不是100%肯定它会起作用,你可以尝试。