0

我对 GWTP 中的会话管理有几个基本问​​题。

  1. 现在,我们在用户登录到应用程序时创建一个新会话。现在,我可以打开浏览器并使用令牌直接输入应用程序 url 而无需登录。它将向用户呈现 UI 页面而无需任何检查。现在,我们在服务器端进行了会话检查。因此,如果 UI 页面仅在渲染时进行服务器调用,我会知道会话无效,我可以将他重定向到登录页面。但是,我们如何处理 UI 页面没有任何服务器端逻辑并且用户直接粘贴带有该令牌的 URL 的情况。

我是否必须对来自 GWTP 演示者的每个页面请求进行服务器调用才能检查会话是否有效?或者我们还有其他方法吗?

  1. 我没有将任何显式会话 ID 参数从 GWT 客户端传递到服务器。它只有 JSessionId 从浏览器自动传递到服务器。我们只是在服务器中执行 request.getSession() 并查看它是否为空(如果为空则不登录)。所以我希望我们对此没有任何安全问题。请确认。

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

4

2 回答 2

1

不,您不需要每次都调用服务器。当你登录时,在登录的守护者类中只设置一次当前用户。@UseGatekeeper 注释只检查当前用户实例,不进行任何服务器调用。如果当前用户存在,那么它将从 canReveal 方法返回 true。并且它将允许访问 url 中的演示者名称令牌。

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

>> let me know if the understanding is fine with your solution. Also, what about point 2 and 3 questions?

A.1 U 可以使用 jsession 没有任何安全问题。A.2 通过使用 JSESSION id,你可以传递 jsession id 来进行服务器调用,因为如果服务器获得相同的会话,它就可以工作。

于 2012-06-21T08:21:59.623 回答
0

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

@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> {}

您必须确保您的自定义 ginjector 有一个getLoggedInGatekeeper()方法。在您的 ginjector 中,您还可以使用该@DefaultGatekeeper方法来注释 get 方法,该方法返回要用于任何未使用 注释的代理的 Gatekeeper 类@UseGatekeeper。如果您使用 a@DefaultGatekeeper并且想指定代理不应该使用任何网守,则@NoGatekeeper在该代理上使用注释。

您必须确保处理错误的演示者没有使用 Gatekeeper,否则您可能会遇到错误。出于这个原因,最好用@NoGatekeeper. 演示者处理错误是您的自定义 PlaceManagerrevealErrorPlace方法所揭示的错误。如果您不覆盖该方法,那么它就是您的方法所揭示的revealDefaultPlace方法。

有关更多信息,请参阅GWTP 文档

于 2012-06-21T07:01:09.100 回答