【问题标题】:Spring HTTP Invoker session (state) storageSpring HTTP Invoker 会话(状态)存储
【发布时间】:2013-08-28 08:44:57
【问题描述】:

我有一个 Swing 客户端和一个在 tomcat 7 上运行的服务器,它们使用 Spring (3.1) HTTP 调用程序相互通信。到目前为止,通信工作正常(即使使用 TSL),但现在我正在尝试添加 Spring Security。

旁注:在典型的 Web 应用程序中,我会使用基本身份验证来验证用户身份。在我的 CustomAuthenticationProvider 为用户返回一个 Authentication 对象后,一切都“正常工作”,这意味着在每个进一步的请求中,SecurityContext 都会自动设置。我猜登录会向客户端返回一个会话密钥,该密钥会在每次请求时发送以识别会话。

这正是我在使用 HTTP-Invoker 时所寻找的。目前,我似乎在每个请求上都获得了一个新的上下文,这很糟糕,因为我的 customAuthenticationManager.authenticate(Authentication auth) 方法非常昂贵,并且每个用户会话实际上应该只调用一次。

有什么想法吗?

编辑我在 http://forum.springsource.org/showthread.php?10764-Maintaing-State-while-using-HttpInvoker 找到了一些提示,但由于这个链接已经有 8 年以上的历史了,我希望有一个更简单的解决方案。

【问题讨论】:

    标签: spring spring-security httpinvoker


    【解决方案1】:

    我现在找到了解决方案。首先,您需要知道 spring-security 部分与 Web 应用程序中的部分完全相同(这很棒)。

    在客户端,您需要更复杂的 HTTP 客户端实现。我用org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor。在服务器端,您可以使用<http-元素的create-session="always"-Attribute 来确保始终创建会话。但是,我发现自己创建会话更好(只需调用 httpServletRequest.getSession() ,如果不存在则创建会话),因为这样您可以指定何时执行此操作。在我的情况下,只有当身份验证成功时,我才会在我的 authenticationProvider 中创建会话。

    【讨论】:

    • 非常感谢分享答案!我们有类似的情况,除了一个例外,我们使用的是 spring 2.5.x。因此我们不得不使用 org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor (这里指出:forum.springsource.org/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2016-11-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多