2012-06-21 4 views
0

У меня есть несколько основных вопросов по управлению сеансами в GWTP.Управление сеансом сервера в GWTP

  1. Теперь мы создаем новый сеанс, когда пользователь входит в приложение. Теперь я могу открыть браузер и ввести URL-адрес приложения с токеном непосредственно без входа в систему. Он сделает страницу пользовательского интерфейса пользователем без каких-либо проверок. Теперь у нас есть сеансовые проверки на стороне сервера. Поэтому, если страница пользовательского интерфейса делает вызов сервера только при рендеринге, я узнаю, что сеанс недействителен и я могу перенаправить его на страницу входа. Но как мы обрабатываем случаи, когда страница пользовательского интерфейса не имеет логики на стороне сервера, а пользователь напрямую вставляет URL-адрес с этим токеном.

Должен ли я выполнять вызов сервера на каждый запрос страницы от ведущего GWTP только для проверки сессии? или у нас есть другие подходы к этому?

  1. Я не передаю какой-либо явный идентификатор сеанса от клиента GWT на сервер. Его только JSessionId автоматически передается от браузера к серверу. Мы просто делаем request.getSession() на сервере и видим, является ли оно нулевым или нет (не зарегистрировано, если значение null). Поэтому я надеюсь, что у нас нет проблем с безопасностью. Пожалуйста подтвердите.

  2. С клиентом GWT, работающим на основе логики на стороне android и на стороне сервера, представленной как Restful Web-сервисы с использованием Джерси, как мы поддерживаем сеанс, потому что Restful WS являются апатридами. Теперь, как мы можем достичь пользовательской сессии в этом случае?

ответ

1

номер не требуется, чтобы сервер вызова каждый раз. когда u logged, тогда установите текущего пользователя только один раз в зарегистрированном классе keeper. @UseGatekeeper аннотирование проверки текущего пользовательского экземпляра только не вызывает никакого вызова сервера. если текущий пользователь существует, то он вернет true из метода canReveal. И он позволит получить доступ к этому токену имени презентатора в 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, вы можете передать идентификатор jsession для вызова сервера, потому что сервер работает, если он получит тот же сеанс.

+0

Большое спасибо за ваши ценные материалы. Я реализую ту же логику. Я жду третьего вопроса от кого-то и закрою тему позже. – Santosh

+0

У меня есть еще один очень простой вопрос. Извините, если это слишком глупо ... Я получу объект User, как только я закончу с помощью вызова сервера. Но GIN уже создал все объекты в начале, и LoggedInGateKeeper создал бы с нулевым пользователем. Как я могу вставить элемент CurrentUser с возвращаемым значением моего сервера? – Santosh

+0

Вы только что установили аннотацию @NoGatekeeper для домашнего пользователя presenter.set, зарегистрированного пользователем (текущий объект bean-объекта пользователя) при входе в систему. Я думаю, что у вас есть идея для другого ведущего, который предоставит текущему пользователю. И назначить текущему пользователю значение null После выхода из системы. – iMBMT

0

Хотя безопасность всегда должна выполняться на стороне сервера, вы, вероятно, не хотите, чтобы обычные пользователи заглядывали на ваши страницы администрирования. В GWTP вы можете помешать некоторым докладчикам выявить себя, создав свои собственные классы гейткиперов.

@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, возвращающего класс гейткипера, который вы хотите использовать для любого прокси-сервера, который не аннотируется с помощью @UseGatekeeper. Если вы используете @DefaultGatekeeper и хотите указать, что прокси-сервер не должен использовать какого-либо гейткипера, используйте аннотацию @NoGatekeeper на этом прокси.

Вы должны убедиться, что ошибки обработки презентатора не используются в Gatekeeper, иначе вы рискуете запуском в ошибке. По этой причине, это хорошая практика, чтобы аннотировать прокси этого ведущего с @NoGatekeeper. Ошибки обработки презентатора - это тот, который определяется вашим обычным методом PlaceManager revealErrorPlace. Если вы не переопределите этот метод, то это тот, который был обнаружен вашим методом revealDefaultPlace.

Обратитесь к GWTP docs для получения дополнительной информации

+1

То, что я понимаю из выше, заключается в том, что вам необходимо сделать вызов сервера, чтобы, наконец, узнать, вошел ли пользователь в систему или нет, и если я хочу проверить все ведущие в своем приложении, то на каждом запросе страницы мы делаем вызов сервера с использованием подхода GateKeeper независимо от того, вошел ли пользователь в систему или нет. сообщите мне, если понимание в порядке с вашим решением. Также, как насчет вопросов 2 и 3 пункта? – Santosh

Смежные вопросы