Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用jsessionid URL参数使基于Spring的应用程序工作_Java_Spring_Session_Spring Security_Sessionid - Fatal编程技术网

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

Java 如何使用jsessionid URL参数使基于Spring的应用程序工作,java,spring,session,spring-security,sessionid,Java,Spring,Session,Spring Security,Sessionid,我们有一个带有RESTAPI的应用程序。它基于Spring,也使用Spring安全性。 例如,我们配置了一些基于角色的限制: <sec:http auto-config="true" access-decision-manager-ref="accessDecisionManager"> <sec:intercept-url pattern="/auth/authenticate" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

我们有一个带有RESTAPI的应用程序。它基于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。在那之后,我试图请求
/用户;jsessionid=*并获得401状态代码,这意味着应用程序无法识别我。为了使这种方法有效,我们应该改变什么

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

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

REST服务通常在每个请求上都经过身份验证, 通常不是通过会话

现在,原因是

  • 这些类型的xml基API的客户机或使用者不是浏览器,而是其他应用程序
  • 浏览器了解cookies,事实上cookies是针对基于浏览器的用户,而不是一般的应用程序
  • 客户端可能理解也可能不理解cookie,并且在大多数情况下都不会理解cookie,因为cookie不是这些类型API的标准身份验证方法
有比以非标准cookie方式处理此问题更好的方法。不确定您使用的是哪个版本的spring security,这是用于保护RESTful应用程序的spring security 3.1的一个示例

编辑:


退房。这迫使tomcat(不确定是否使用tomcat)不使用cookie处理会话。但一旦完成,这将无法处理基于cookie的会话。我不是100%肯定它会起作用,尽管如此,你还是可以试试

如果禁用浏览器中的Cookie,然后登录会发生什么?我得到了正确的JSON响应,如{“结果”:{“状态”:“成功”,“消息”:“请求成功”,“时间戳”:1329740163355},“数据”:{“电子邮件”:“user@***.com”,“角色”:[“user”]}设置JSSessionID Cookies的头让我总结一下:JSSessionID在浏览器中工作,但在rest客户端中不工作?当然,这个响应是由我们的控制器生成的。由于cookies被禁用,我在尝试访问/公司时获得了401;jsessionid=…不,作为URL参数,它根本不起作用。它只有在cookies中设置的情况下才能工作。我完全同意基于cookies的身份验证系统对REST不好,但这不是我们的决定。目前,我们需要在URL中使用jsessionId而不是Cookies来创建工作机制。这并不容易,而且肯定不是现成的。jsessionid附加的URL是由容器生成的,它知道如何处理它们。对于其余url,它们不会生成,因此服务器不准备处理它们。因此,您的要求是:它应该决定运行时,是否支持cookie,然后使用cookie,否则是否使用url重写?