使用spring ws支持的webapplication进行会话管理

Jay*_*Jay 6 java architecture spring web-services web-applications

我正在尝试创建一个web应用程序,它将使用js前端并在后端调用Spring WS.假设这是一个购物网站类型的网站.所以,我可以有类似的服务OrderService InventoryService ShippingService等等.唯一需要会话的是用户的购物车.现在,就这个购物车而言,使用servlet容器进行会话管理是否有意义?或者,我是否应该将会话CartService信息持久保存到数据库中?

使用WebServices进行会话管理时,最佳做法是什么?我想,最好的做法是保持服务无状态,但如果我有无状态的web服务,如何授权用户呢?

使用servlet容器进行会话管理然后让不同的控制器充当web服务的代理是一种很好的做法吗?

我附上一张图片,让你更好地理解背景. 在此输入图像描述

Mil*_*gor 5

如果我有无状态的Web服务,如何授权用户?

  1. 如果您的应用程序使用外部ws,则此处描述相当常见的方法.

  2. 如果所有ws都是您交付的一部分,您肯定可以使用spring-security.

  3. 一种非常常见的方法是将(apache)http服务器作为代理,例如ldap,用于身份验证和授权.

使用servlet容器进行会话管理然后让不同的控制器充当web服务的代理是一种很好的做法吗?

我认为不是.如此处所述,您只能从保持Web服务无状态中受益,如果需要在请求之间维护状态,请使用cookie.

如果状态(购物车)应该在注销后继续存在,那么像CartService这样的东西听起来对我来说是一个好主意.


Mil*_*gor 2

如果webservice是无状态的,我如何知道ajax请求是否被授权?我如何知道ajax请求来自webapp1的user1,谁被授权了?而不是来自 webapp2 的 user2,谁无权访问该服务?

好问题。快速回答是:

  1. 对于基本身份验证:用户名:密码采用 base64 编码并存储在客户端发送的每个请求的授权http 标头中。请参阅此维基条目。标题看起来像这样:

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

    使用spring security,配置可以是这样的:

    <http pattern="/api/**" create-session="stateless">
        <intercept-url pattern='/**' access="hasRole('REMOTE')" />
        <http-basic />
    </http>
Run Code Online (Sandbox Code Playgroud)
  1. 对于基于表单的 WS身份验证,请查看这篇文章

    • 首先,您向/j_spring_security_check发送了一个发布请求。此请求将返回 Cookie,随后针对 Web 服务的任何后续请求将使用该 Cookie。他们将其存储在文本文件中:

      curl -i -X POST -d j_username=user -d j_password=userPass -c /tmp/cookies.txt http://localhost:8080/app/j_spring_security_check

    • 然后您可以使用文件中的 cookie 来执行进一步的身份验证请求:

      curl -i --header "Accept:application/json" -X GET -b /tmp/cookies.txt http://localhost:8080/app/api/foos

    xml spring security 配置可以如下所示:

    <http pattern="/api/**" create-session="stateless">
        <intercept-url pattern='/**' access="hasRole('REMOTE')" />
        <form-login />
    </http>
Run Code Online (Sandbox Code Playgroud)