Java GWT应用程序是否受益于会话群集?

Java GWT应用程序是否受益于会话群集?,java,session,gwt,session-state,cloudbees,Java,Session,Gwt,Session State,Cloudbees,许多Java应用程序(如)提供会话集群/存储,这样用户在特定请求中被路由到哪个服务器节点并不重要,所有服务器节点共享相同的存储会话数据,因此任何服务器都可以为任何客户机请求提供服务 我想知道这如何适用于客户端MVC、单页应用程序,比如GWT应用程序 使用GWT,大多数应用程序都以JavaScript的形式执行客户端。通常,客户端访问服务器的唯一时间(通过GWT-RPC或RequestFactory)是客户端需要数据时,在这种情况下,它会在引擎盖下对GWTServlet进行特殊调用 我对共享会话存

许多Java应用程序(如)提供会话集群/存储,这样用户在特定请求中被路由到哪个服务器节点并不重要,所有服务器节点共享相同的存储会话数据,因此任何服务器都可以为任何客户机请求提供服务

我想知道这如何适用于客户端MVC、单页应用程序,比如GWT应用程序

使用GWT,大多数应用程序都以JavaScript的形式执行客户端。通常,客户端访问服务器的唯一时间(通过GWT-RPC或RequestFactory)是客户端需要数据时,在这种情况下,它会在引擎盖下对
GWTServlet
进行特殊调用

我对共享会话存储的理解是,它适用于
HttpServlet
以及客户端(请求)和服务器(响应)之间的来回对话。但这似乎并不适用于GWT领域

所以我问:我的GWT应用程序能否从上面提到的应用程序会话存储中获益为什么?如果是这样,我们非常感谢具体的例子!提前谢谢

示例:

我有一个允许客户端用户执行某些操作的应用程序:

public class BackOfficeServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        User u = getUserFromRequest(request);
        Action a = getActionFromRequest(request);

        // If the user is allowed to do the action, then do it.
        if(UserActionAuthenticator.actionIsAllowed(u, a))
            a.execute(u, request);
    }
}

如何/在何处使用
HttpSession
添加上述代码示例中不存在的安全性或功能?

只有在使用会话存储某些数据时,使用会话群集才有意义。询问您:是否需要在服务器端会话中保存某些内容?如果响应为否,那么也不需要使用会话集群。GWT完全是关于状态完整的客户端。大多数情况下,您可以通过直接在浏览器中保存会话数据来消除服务器端会话的需要。我举一个我不想这样做的例子(在这种情况下,会话集群将非常有用):

假设您的应用程序是后台。每个用户都必须登录,他可以有不同的角色。通常,带有角色的列表将出现在客户端(能够显示/隐藏一些UI控件)和服务器端(链接到会话,以便在服务器端进行两次相同的检查)。您不能信任客户端的角色,因为最终用户可能会直接在浏览器中修改它们(即使在缩小JS的情况下这是一项非常复杂的任务)。这里有两个选项:1)使用服务器端会话2)模拟服务器端会话(在每个RPC调用中发送一些自定义会话令牌,然后每次重新加载用户角色)。我更喜欢第一个选项,它使我能够重用现有的安全库,如SpringSecurity(为我节省大量时间/bug)。您可以根据需要选择第二个选项(您的项目有足够的资源来实现和测试您自己的服务器端会话仿真和安全方面的实现,使服务器端完全无状态)

总结如下:

  • 您有一些敏感的会话数据->将它们存储在服务器会话->您需要会话群集
  • 您的会话数据不敏感/您根本没有这些数据->将它们存储在浏览器中/无需存储->您不需要会话和会话群集
  • 您有一些敏感的会话数据->将它们存储在服务器端的某个位置,并使用一些自定义会话模拟技术为每个请求重新加载它们->您不需要会话群集(但您需要比选项1更多的时间来完成)
  • 编辑。 在上面的代码示例中,可能存在以下潜在问题:

  • 用户以user1(具有角色\用户权限)登录
  • 他以某种方式生成了内部有user2的请求(具有ROLE\u ADMIN权限)和一些只有在您具有ROLE\u ADMIN权限时才能执行的操作
  • 即使user1没有相应的权限,也将执行此操作
  • 问题的原因是用户对象来自不受信任的源(请求),最终用户可以对其进行修改。我们可以使用服务器端会话将其存储在服务器端,而不是将其存储在客户端:

    public class BackOfficeServlet extends HttpServlet {
        @Override
        public void doPost(HttpServletRequest request, HttpServletResponse response) {
            User u = getUserFromSession(request.getSession(false));
            Action a = getActionFromRequest(request);
    
            if(UserActionAuthenticator.actionIsAllowed(u, a))
                a.execute(u, request);
        }
    }
    

    现在我们可以信任用户对象,因为最终用户无法更改会话对象。

    只有在使用会话存储某些数据时,使用会话群集才有意义。询问您:是否需要在服务器端会话中保存某些内容?如果响应为否,那么也不需要使用会话集群。GWT完全是关于状态完整的客户端。大多数情况下,您可以通过直接在浏览器中保存会话数据来消除服务器端会话的需要。我举一个我不想这样做的例子(在这种情况下,会话集群将非常有用):

    假设您的应用程序是后台。每个用户都必须登录,他可以有不同的角色。通常,带有角色的列表将出现在客户端(能够显示/隐藏一些UI控件)和服务器端(链接到会话,以便在服务器端进行两次相同的检查)。您不能信任客户端的角色,因为最终用户可能会直接在浏览器中修改它们(即使在缩小JS的情况下这是一项非常复杂的任务)。这里有两个选项:1)使用服务器端会话2)模拟服务器端会话(在每个RPC调用中发送一些自定义会话令牌,然后每次重新加载用户角色)。我更喜欢第一个选项,它使我能够重用现有的安全库,如SpringSecurity(为我节省大量时间/bug)。您可以根据需要选择第二个选项(您的项目有足够的资源来实现和测试您自己的服务器端会话仿真和安全方面的实现,使服务器端完全无状态)

    总结如下:

  • 您有一些敏感的会话数据->将它们存储在服务器会话->您需要会话群集
  • 您的会话数据不敏感/您根本没有这些数据->将它们存储在浏览器中/无需存储->您不需要会话和会话群集
  • 您有一些敏感的会话数据->将它们存储在服务器sid上的某个位置