GWT (2.4.0) + XSRF

He estado tratando de hacer que XSRF funcione en una aplicación web sin éxito. Estoy mirando una implementación de inicio de sesión típica.

Estoy siguiendoCodigo de google. Cambié mi 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>

y extendidoXsrfProtectedServiceServlet en el servidor del archivo Impl de mi servicio de inicio de sesión. Tengo entendido que no se necesita ningún otro cambio en el servidor. ¿Necesito agregar algo más, como un método que devuelva unRpcToken Aquí (así como en la interfaz que estoy implementando)?

En el lado del cliente, uso anotaciones.

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

Esto es probablemente donde me falta algo. Google dice en la punta:Tip: To specify which RpcToken implementation GWT should generate serializers for use @RpcTokenImplementation annotation. No estoy seguro de qué significa eso o si necesito otro método aquí para devolver un RpcToken.

Mi interfaz asíncrona es así:

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

Luego, para mi llamada RPC real, envuelvo mi código alrededor de la solicitud del token xsrf. Yo uso el código idéntico al de 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>

La queja es que la llamada a getNewXsrfToken falla porque no sabe la ubicación xsrf de la llamada aquí:GWT.getModuleBaseURL() + "xsrf". Me da la sensación de que falta un protocolo de enlace que causa este error, pero no estoy seguro.

Por último, también traté de implementarCódigo de Nick Siderakis pero su ejemplo usa una página JSP que pregunta al servidor:XsrfTokenUtil.getToken(request.getSession().getId()). No quiero usar páginas JSP y no he descubierto cómo realizar esto sin una página jsp. Su código también difiere del ejemplo de código de Google (es decir, no llama a getNewXsrfToken), que no sé si es la forma "preferida" de Google de tratar con XSRF.

¿Alguna idea sobre lo que me estoy perdiendo? Gracias.

EDITAR

Solución abajo ...

Respuestas a la pregunta(1)

Su respuesta a la pregunta