java - 如何使基于 Spring 的应用程序与 jsessionid URL 参数一起工作

标签 java spring session spring-security sessionid

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

<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 传递的可能性。我以为我们不需要更改代码中的任何内容,但是出了问题。 我请求/login 方法并从响应中复制 jsessionid 。之后我尝试请求 /users;jsessionid=* 并得到 401 状态代码,这意味着应用程序无法识别我。为了使这种方法发挥作用,我们应该改变什么?

最佳答案

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

检查this在同一个论坛上发帖。引用帖子:

A REST service is generally authenticated on each and every request, not normally by a session.

现在的原因是

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

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

编辑:

查看this link 。这会强制tomcat(不确定你是否使用tomcat)不使用cookie来处理 session 。但一旦完成,这将不会处理基于 cookie 的 session 。我不是 100% 确定它会起作用,但你可以尝试一下。

关于java - 如何使基于 Spring 的应用程序与 jsessionid URL 参数一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9360768/

相关文章:

java - 来自外部jar问题的Spring UTF-8消息资源

java - Spring Boot 1.5.1 和 "The dependencies of some of the beans in the application context form a cycle"

python - 在 sqlalchemy 中跨不同模块访问相同的 db.session

javascript - 如何在 ASP.NET 中阻止/防止用户注销后返回上一页

java - 如何制作带有颜色的正方形按钮?

java - 服务器和客户端之间的简单连接。客户端发送消息,服务器正确接收消息。但是当服务器尝试回复时什么也不起作用?

java - 如何使用 ANTLR 4 实现逻辑运算符(and、or)?

java - 带有 GWT RemoteServiceServlet 的 GWTP NullPointerException

java - 通过 Servlet 下载 Excel 文件

c# - 在我的 BaseController 构造函数中获取现有 session