GWT (2.4.0) + XSRF

Eu tenho tentado fazer o XSRF trabalhar em um webapp sem sucesso. Eu estou olhando para uma implementação típica de login.

Eu estou seguindoCódigo do Google. Eu mudei meu web.xml para incluir:

<code><servlet>
    <servlet-name>xsrf</servlet-name>
    <servlet-class>com.google.gwt.user.server.rpc.XsrfTokenServiceServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>xsrf</servlet-name>
    <url-pattern>/gwt/xsrf</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>gwt.xsrf.session_cookie_name</param-name>
    <param-value>JSESSIONID</param-value>
</context-param>
</code>

e estendidoXsrfProtectedServiceServlet no servidor Impl arquivo do meu serviço de login. É meu entendimento que nenhuma outra mudança é necessária no servidor. Preciso adicionar mais alguma coisa, como um método que retorna umRpcToken aqui (assim como na interface que estou implementando)?

No lado do cliente, eu uso anotações.

<code>@XsrfProtect
@RemoteServiceRelativePath("login")
public interface LoginService extends RemoteService {
    String check(String user, String pass) throws IllegalArgumentExceptionhere;
}
</code>

Este é provavelmente o lugar onde estou faltando alguma coisa. Google diz na ponta:Tip: To specify which RpcToken implementation GWT should generate serializers for use @RpcTokenImplementation annotation. Não tenho certeza do que isso significa ou se preciso de outro método aqui para retornar um RpcToken.

Minha interface assíncrona é assim:

<code>public interface LoginServiceAsync {
    //Returns the Session ID
    void check(String user, String pass, AsyncCallback<String> callback);
}
</code>

Então, para minha chamada RPC real, eu envolvo meu código em torno da solicitação do token xsrf. Eu uso código idêntico ao do google:

<code>XsrfTokenServiceAsync xsrf = (XsrfTokenServiceAsync)GWT.create(XsrfTokenService.class);
((ServiceDefTarget)xsrf).setServiceEntryPoint(GWT.getModuleBaseURL() + "xsrf");
xsrf.getNewXsrfToken(new AsyncCallback<XsrfToken>() {

    public void onSuccess(XsrfToken token) {
        LoginServiceAsync rpc = (LoginServiceAsync)GWT.create(LoginService.class);
        ((HasRpcToken) rpc).setRpcToken(token);

        // make XSRF protected RPC call
        rpc.check(user, pass, new AsyncCallback<String>() {
            // ...
        });
    }

    public void onFailure(Throwable caught) {
        try {
             throw caught;
        } catch (RpcTokenException e) {
        // Can be thrown for several reasons:
        //   - duplicate session cookie, which may be a sign of a cookie
        //     overwrite attack
        //   - XSRF token cannot be generated because session cookie isn't
        //     present
        } catch (Throwable e) {
        // unexpected
    }
});
</code>

A reclamação é que a chamada para getNewXsrfToken falha porque não sabe que a localização do xsrf da chamada aqui:GWT.getModuleBaseURL() + "xsrf". Tenho a sensação de que há um aperto de mão simbólico que causa esse erro, mas não tenho certeza.

Por fim, também tentei implementarCódigo de Nick Siderakis mas o seu exemplo usa uma página JSP que pergunta ao servidor:XsrfTokenUtil.getToken(request.getSession().getId()). Eu não quero usar páginas JSP e não descobri como fazer isso sem uma página jsp. Seu código também diverge do exemplo de código do Google (ou seja, ele não chama getNewXsrfToken), que eu não sei se é a maneira "preferida" de lidar com o XSRF.

Alguma idéia do que estou perdendo? Obrigado.

EDITAR

Solução abaixo ...

questionAnswers(1)

yourAnswerToTheQuestion