#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>