如何用GWT屏蔽浏览器URL



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

目前,当我访问应用程序页面时,我的浏览器URL如下所示:

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

或:

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

我想用这样的编码来屏蔽URL:

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

例如,VaadinFramework做了完全相同的事情(VaadinDemo(,但我不知道如何在我的应用程序中获得它。

在您的应用程序中,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(,我只能建议不要屏蔽它——为了SEO和可用性,URL页面名称应该可读

然而,在某些情况下,您需要标识某个实体,但不想公开显示其自动递增的ID。假设您有一个包含文件数据的数据库,但不希望在URL上显示自动递增的标识。例如,Google Drive具有以下类型的链接:https://docs.google.com/document/d/1TZplxR3yFGyPcCuaLHKptoVnxL4jOsTEGWFdqMoIu8/edit。为了实现这一点,我看到了至少两个相对简单的解决方案:

  • 使用一个唯一的随机生成的ID。添加一个额外的字段"idTag"到要屏蔽的实体的数据库表,并确保它是唯一且不为null。这个额外的字段也成为一个标识符实体的。您可以使用生成唯一ID例如UUID.randomUUID().toString()。然后您可以创建类似#!config/users/cd9467cb-064a-4427-987f-738051dc5f79的链接代替CCD_ 6(在自动递增的情况下,每个有链接的人都会知道数据库(
  • 或者,您的#!config/sdsuwksp值可以是加密的字符串,您可以在每次请求时解密该字符串以检查实际请求。你可以使用gwt加密。客户端可以使用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类与我自己的类:

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

最新更新