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

时间:2015-08-11 18:47:34

标签: java spring web-services web-applications architecture

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

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

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

我附上一张照片,让您更好地了解情境。 enter image description here

3 个答案:

答案 0 :(得分:5)

  

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

  1. 如果你的应用程序使用外部ws,则描述了相当常见的方法here

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

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

  4.   

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

    我认为不是。正如所讨论的here,您只能从保持Web服务无状态中受益,如果您需要在请求之间维护状态,请使用cookie。

    如果状态(购物车)应该在注销后继续存在,那么 CartService 之类的东西对我来说听起来不错。

答案 1 :(得分:2)

您可以参考Spring-WS security

检查here,查看在Spring Boot应用程序中使用WS-Security的示例。具体来说,请参阅WebServiceServerConfig。

答案 2 :(得分:2)

  

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

好问题。快速回答是:

  1. 对于基本身份验证:用户名:密码为base64编码,并存储在授权 http标头中,用于客户端发送的每个请求。见this wiki entry。标题如下所示:

    Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

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

  2.     <http pattern="/api/**" create-session="stateless">
            <intercept-url pattern='/**' access="hasRole('REMOTE')" />
            <http-basic />
        </http>
    
    1. 对于基于 form 的WS身份验证,请查看this article

      • 首先,您向 / j_spring_security_check 发送了一个帖子请求。此请求将返回Cookie,然后将由任何后续请求对Web服务使用。在这里,他们将它存储在一个文本文件中:

        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安全配置如下所示:

    2.     <http pattern="/api/**" create-session="stateless">
              <intercept-url pattern='/**' access="hasRole('REMOTE')" />
              <form-login />
          </http>