Google App Engine UserServiceget.CurrentUser() возвращает null в канале обработки сервлета, подключенном к /_ah/channel/connected/

Я использую API-интерфейс Google Channel и зарегистрированный сервлет по адресу /_ah/channel/connected/ для обработки соединений с пользовательскими каналами. Когда соединение происходит в обработчике сообщений, я узнаю, что UserServiceget.CurrentUser() возвращает null, а в других сервлетах моего приложения возвращает пользователя. В чем дело подскажите пожалуйста. Код сервлета такой:

@SuppressWarnings("serial")
public class ConnectServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest req, HttpServletResponse resp)
                    throws IOException {
        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();

        if( user != null ){        
        String user_name = user.getNickname();
        Logger.getLogger("server").log( Level.WARNING, "User " + user_name + "  connected" );
       }
    }
}

ограничение безопасности:

<security-constraint>
    <web-resource-collection>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

person Dmitry    schedule 29.08.2012    source источник


Ответы (1)


Вызов /_ah/channel/connected/ выполняется внутренним сервисным сервером Google Channel, а не пользователем напрямую. Таким образом, этот запрос не имеет связанного с ним пользователя.

Это пример работы с Channel API:

  1. Сервер: создайте уникальный идентификатор клиента на сервере. Вы можете использовать идентификатор пользователя:

    String clientId = userService.getCurrentUser().getUserId();
    
  2. Сервер: создайте токен канала из идентификатора клиента и передайте его обратно на сторону клиента:

    ChannelService channelService = ChannelServiceFactory.getChannelService();
    String token = channelService.createChannel(clientId);
    
  3. Используйте токен в Javascript на стороне клиента:

    // --token-- a token received from server
    channel = new goog.appengine.Channel('--token--');
    
  4. Затем в обработчике /_ah/channel/connected/ вы можете сделать:

    ChannelService channelService = ChannelServiceFactory.getChannelService();
    ChannelPresence presence = channelService.parsePresence(req);
    String clientId = presence.clientId();
    // clientId equals userId as set in point 1. 
    
person Peter Knego    schedule 29.08.2012
comment
Ой ну спасибо. Теперь я знаю идентификатор клиента пользователя, который подключается. Это то, что мне было нужно. - person Dmitry; 29.08.2012
comment
я бы не рекомендовал использовать Каналы; cloud.google.com/appengine/docs/deprecations/channel - person Jeryl Cook; 28.11.2016