1

ユーザーチャネル接続を処理するために、GoogleChannelAPIとadreess/_ah / channel /connected/に登録されたサーブレットを使用しています。メッセージ後ハンドラで接続が発生すると、UserServiceget.CurrentUser()がnullを返すのに対し、アプリケーションの他のサーブレットではuserを返すことがわかりました。何の場合は教えてください。サーブレットコードは次のようになります。

@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>
4

1 に答える 1

3

の呼び出し/_ah/channel/connected/は、ユーザーが直接行うのではなく、内部のGoogleChannelサービスサーバーによって行われます。したがって、このリクエストにはユーザーが関連付けられていません。

これは、チャネルAPIを処理する方法の例です。

  1. サーバー:サーバー上に一意のクライアントIDを作成します。ユーザーIDを使用できます。

    String clientId = userService.getCurrentUser().getUserId();
    
  2. サーバー:クライアントIDからチャネルトークンを作成し、それをクライアント側に返します。

    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. 
    
于 2012-08-29T12:03:34.997 に答える