如何使用 GWT 屏蔽浏览器 URL

How to mask browser URL with GWT

我目前正在寻找屏蔽 GWT 浏览器 URL。

目前,当我访问应用程序页面时,我的浏览器 URL 看起来像这样:

http://localhost:8080/app/#!config/users

或:

http://localhost:8080/app/#!b/reports?7900

我想用这样的某种编码来掩盖 URLs:

http://localhost:8080/app/#!config/sdsuwksp

例如Vaadin Framework do exactly the same (Vaadin Demo),但我不知道如何在我的应用程序中获取它。

在您的应用程序中,URL 已被处理,可能基于 com.google.gwt.user.client.History.getToken()。 所以,如果你 运行

String token = History.getToken();
String[] params = token.split("/");

在您的示例中,您得到 !configsdsuwksp。我想 !config 会识别该页面,而 sdsuwksp 会是一些屏蔽值。如果此屏蔽值转换为页面(如 http://localhost:8080/app/#!config/users),我只能建议不要屏蔽它 - URL 为了 SEO 和可用性,页面名称应该是可读的.

但是,在某些情况下,您需要识别某些实体,但又不想公开显示其自动递增的 ID。假设您有一个包含文件数据的数据库,并且您不想在 URL 上显示自动递增的 ID。例如,Google 驱动器有这些类型的 link:https://docs.google.com/document/d/1TZplxR3yFGyPcCuaLHKptoVnxL4jOsTEGWFdqMoIu8/edit。为此,我看到至少 2 个相对简单的解决方案:

  • 使用随机生成的唯一 ID。添加一个额外的字段 'idTag' 到 您要屏蔽的实体的数据库 table 并确保它是 唯一且不为空。这个额外的字段也成为一个标识符 实体的。您可以使用生成唯一 ID UUID.randomUUID().toString(),例如。然后你可以创建 link 喜欢 #!config/users/cd9467cb-064a-4427-987f-738051dc5f79 而不是 #!config/users/34 (在自动递增的情况下, 每个拥有 link 的人都知道至少有 34 个用户 数据库)。
  • 或者,您的 #!config/sdsuwksp 值可以是加密的 字符串,您可以在每个请求上解密以检查 实际要求。您可以使用 gwt-crypto。客户端可以使用TripleDES

我用 com.mvp4g.client.history.PlaceService 覆盖解决了它。通过覆盖 convertTokentokenize 方法,我能够屏蔽 GWT 浏览器 URL.

public class MyPlaceService extends PlaceService {

@Override
protected void convertToken(String token) {
    super.convertToken(UrlTokenizer.decode(token));
}

@Override
public String tokenize(String eventName, String param) {
    
    return UrlTokenizer.encode(eventName, param);
}}

最后,在我的 gwt.xml 文件中,我将这些行添加到“替换”PlaceService class 为我自己的 class:

<replace-with class="com.comp.app.gwt.mvp4.myPlaceService">
    <when-type-is class="com.mvp4g.client.history.PlaceService" />
</replace-with>