Как замаскировать URL-адрес браузера с помощью GWT

#java #gwt

#java #gwt

Вопрос:

В настоящее время я ищу маскирующий URL-адрес браузера GWT.

В настоящее время, когда я захожу на страницу приложения, URL-адрес моего браузера выглядит следующим образом:

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

или:

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

Я бы хотел замаскировать URL-адреса с помощью какой-либо кодировки, подобной этой:

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

Например, Vaadin Framework делает то же самое (Vaadin Demo), но я не знаю, как получить это в моем приложении.

Ответ №1:

В вашем приложении URL-адрес уже обработан, вероятно, на основе com.google.gwt.user.client.History.getToken() . Итак, если вы запустите

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

в вашем примере вы получаете !config и sdsuwksp. Я предполагаю, что !config идентифицирует страницу, а sdsuwksp будет некоторым замаскированным значением. Если это замаскированное значение преобразуется в страницы (например http://localhost:8080/app/#!config/users ), я могу только посоветовать не маскировать его — названия страниц URL должны быть удобочитаемыми для SEO и удобства использования.

Однако бывают случаи, когда вам нужно идентифицировать какой-либо объект, но вы не хотите публично отображать его автоматически увеличиваемый идентификатор. Допустим, у вас есть база данных с данными файлов, и вы не хотите отображать идентификатор с автоматическим увеличением в URL. Например, на Google Диске есть такие ссылки: https://docs.google.com/document/d/1TZplxR3yFGyPcCuaLHKptoVnxL4jOsTEGWFdqMoIu8/edit . Для достижения этой цели я вижу как минимум 2 относительно простых решения:

  • Используйте уникальный случайно сгенерированный идентификатор. Добавьте дополнительное поле ‘idTag’ в таблицу базы данных объекта, который вы хотите замаскировать, и убедитесь, что оно уникально, а не равно null. Это дополнительное поле также становится идентификатором объекта. Вы можете сгенерировать уникальный идентификатор с UUID.randomUUID().toString() помощью, например. Затем вы можете создавать ссылки типа #!config/users/cd9467cb-064a-4427-987f-738051dc5f79 вместо #!config/users/34 (которые, в случае автоматического увеличения, все, у кого есть ссылка, будут знать, что в базе данных не менее 34 пользователей).
  • В качестве альтернативы, ваше значение #!config / sdsuwksp может быть зашифрованной строкой, которую вы можете расшифровывать при каждом запросе, чтобы проверить фактический запрос. Вы могли бы использовать gwt-crypto. На стороне клиента могут использоваться триплеты.

Комментарии:

1. Это запрос конкретного клиента, поэтому SEO в данном случае не важен. Я решил это с помощью com.mvp4g.client.history. Переопределение PlaceService. Переопределяя методы convertToken и tokenize, я могу замаскировать URL-адрес браузера GWT.

Ответ №2:

Я решил это с com.mvp4g.client.history.PlaceService помощью переопределения. Переопределяя convertToken и tokenize методы, я могу замаскировать URL-адрес браузера GWT.

 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>