Session GWTP中的服务器会话管理

Session GWTP中的服务器会话管理,session,gwt,rest,Session,Gwt,Rest,我对GWTP中的会话管理有一些基本问题 现在,我们在用户登录到应用程序时创建一个新会话。现在,我可以打开浏览器,直接用令牌键入应用程序url,而无需登录。它将在不进行任何检查的情况下向用户呈现UI页面。现在,我们在服务器端进行了会话检查。所以,如果UI页面仅在呈现时进行服务器调用,我将知道会话无效,我可以将其重定向到登录页面。但是,我们如何处理UI页面没有任何服务器端逻辑并且用户直接使用该令牌粘贴URL的情况呢 我是否必须对来自GWTP presenter的每个页面请求进行服务器调用才能检查会话

我对GWTP中的会话管理有一些基本问题

  • 现在,我们在用户登录到应用程序时创建一个新会话。现在,我可以打开浏览器,直接用令牌键入应用程序url,而无需登录。它将在不进行任何检查的情况下向用户呈现UI页面。现在,我们在服务器端进行了会话检查。所以,如果UI页面仅在呈现时进行服务器调用,我将知道会话无效,我可以将其重定向到登录页面。但是,我们如何处理UI页面没有任何服务器端逻辑并且用户直接使用该令牌粘贴URL的情况呢 我是否必须对来自GWTP presenter的每个页面请求进行服务器调用才能检查会话是否有效?或者我们还有其他方法吗

  • 我没有将任何显式会话id参数从GWT客户端传递到服务器。它是唯一一个从浏览器自动传递到服务器的JSessionId。我们只需在服务器中执行request.getSession(),看看它是否为null(如果为null,则不登录)。所以我希望我们没有任何安全问题。请确认

  • 由于GWT客户端运行在android上,服务器端逻辑使用Jersey作为Restful Web服务公开,我们如何维护会话,因为Restful WS是无状态的。在这种情况下,我们如何实现用户会话


  • 尽管安全性应该始终在服务器端实施,但您可能不希望普通用户浏览您的管理页面。在GWTP中,您可以通过创建自定义的守门人类来防止某些演示者暴露自己

    @Singleton
    public class LoggedInGatekeeper implements Gatekeeper {  
    
      private final CurrentUser currentUser;
    
      @Inject
      public LoggedInGatekeeper (
          final CurrentUser currentUser ) {
        this.currentUser = currentUser;
      }
    
      @Override
      public boolean canReveal() {
        return currentUser.isLoggedIn();
      }
    }
    
    然后,您只需将
    @UseGatekeeper
    注释添加到要保护的每个演示者的代理:

      @ProxyCodeSplit
      @NameToken("userSettings")
      @UseGatekeeper( LoggedInGatekeeper.class )
      public interface MyProxy extends ProxyPlace<MainPagePresenter> {}
    
    @ProxyCodeSplit
    @NameToken(“用户设置”)
    @UseGatekeeper(LoggedInGatekeeper.class)
    公共接口MyProxy扩展了ProxyPlace{}
    
    必须确保自定义Ginject具有
    getLoggedInGatekeeper()
    方法。在Ginject中,您还可以使用
    @DefaultGatekeeper
    方法对get方法进行注释,该方法返回您要用于任何未使用
    @UseGatekeeper
    注释的代理的Gatekeeper类。如果使用
    @DefaultGatekeeper
    并希望指定代理不应使用任何gatekeeper,则在该代理上使用
    @NoGatekeeper
    注释

    您必须确保处理错误的演示者没有使用网守,否则您将面临出错的风险。因此,最好使用
    @NoGatekeeper
    注释演示者的代理。演示者处理错误是由自定义PlaceManager的
    RevealerErrorPlace
    方法显示的错误。如果您不重写该方法,那么它就是您的
    revealDefaultPlace
    方法显示的方法


    有关更多信息,请参阅。您不需要每次都拨打服务器电话。当你登录时,在登录的keeper类中只设置当前用户一次@UseGatekeeper注释仅检查当前用户实例,不进行任何服务器调用。如果当前用户存在,那么它将从canReveal方法返回true。 它将允许访问url中的presenter name标记

    假设您不需要任何会话访问它,那么使用@NoGatekeeper代替它

    >> let me know if the understanding is fine with your solution. Also, what about point 2 and 3 questions?
    
    A.1如果没有任何安全问题,您可以使用jsession。
    A.2通过使用JSESSION id,您可以将JSESSION id传递给执行服务器调用,因为若服务器将获得相同的会话,那个么它就可以工作

    我从上面了解到的是,您必须进行服务器调用,以最终了解用户是否登录,如果我想检查我的应用程序中的所有演示者,那么在每个页面请求上,无论用户是否登录,我们都使用网关守护方法进行服务器调用。让我知道你的理解是否适合你的解决方案。另外,关于第2点和第3点的问题呢?非常感谢您的宝贵意见。我将实现相同的逻辑。我正在等待任何人提出第三个问题,稍后我将结束这个话题。我还有一个非常基本的问题。抱歉,如果这太傻了…我将在完成服务器调用后获取用户对象。但GIN在一开始就已经创建了所有对象,LoggedInGateKeeper将使用null user创建。如何将服务器返回的值注入CurrentUser成员?您只需在登录时为home presenter设置@NoGatekeeper注释。设置登录用户(当前用户bean对象)。我想你会对其他演讲者产生想法,它将为你提供当前用户。注销后分配给当前用户为空。非常感谢。我终于让它工作了。我只是希望有人能对我的最后一点发表评论(RESTfulWS中的会话)