GWT (2.4.0) + XSRF

Я пытался заставить XSRF работать над веб-приложением, но безрезультатно. Я смотрю на типичную реализацию входа в систему.

Я следуюКод Google. I changed my web.xml to include:

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

и продленXsrfProtectedServiceServlet на сервере Impl файл моего сервиса входа в систему. Насколько я понимаю, никаких других изменений на сервере не требуется. Нужно ли добавить что-нибудь еще, например, метод, который возвращаетRpcToken здесь (а также в интерфейсе, который я реализую)?

На стороне клиента я использую аннотации.

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

Это, вероятно, где я что-то упустил. Google говорит о чаевых:Tip: To specify which RpcToken implementation GWT should generate serializers for use @RpcTokenImplementation annotation. Не уверен, что это значит, или если мне нужен другой метод для возврата RpcToken.

Мой асинхронный интерфейс выглядит так:

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

Затем для моего реального вызова RPC я обертываю свой код вокруг запроса токена xsrf. Я использую код, идентичный 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>

Я жалуюсь на то, что вызов getNewXsrfToken не выполняется, так как он не знает, где находится xsrf, из этого вызова:GWT.getModuleBaseURL() + "xsrf", У меня такое ощущение, что отсутствует рукопожатие токена, которое вызывает эту ошибку, но я не уверен.

Наконец, я также попытался реализоватьНик Сидеракис & apos; код но его пример использует страницу JSP, которая запрашивает сервер:XsrfTokenUtil.getToken(request.getSession().getId()), Я не хочу использовать страницы JSP, и я не понял, как это сделать без страницы JSP. Его код также отличается от примера кода Google (т. Е. Он не вызывает getNewXsrfToken), который я не знаю, является ли он "предпочтительным". Google способ борьбы с XSRF.

Есть идеи, что мне не хватает? Благодарю.

EDIT

Решение ниже ...

Ответы на вопрос(1)

Ваш ответ на вопрос