GWTP Rest dispatch: replace DefaultRequestBuilderFactory with own implementation

125 views Asked by At

My GWT frontend is on port 8888. REST backend is on 8080. By default cookies not work. Seems that cookies should be passed if I will call RequestBuilder.setIncludeCredentials() for the request. In this case I need to replace DefaultRequestBuilderFactory with my own implementation because I need to send cookies to server.

SecuredRequestBuilderFactory.java:

public class SecuredRequestBuilderFactory extends DefaultRequestBuilderFactory {
    public SecuredRequestBuilderFactory(HttpRequestBuilderFactory httpRequestBuilderFactory, BodyFactory bodyFactory, HeaderFactory headerFactory, UriFactory uriFactory, @RequestTimeout Integer requestTimeoutMs) {
        super(httpRequestBuilderFactory, bodyFactory, headerFactory, uriFactory, requestTimeoutMs);
    }

    @Override
    public <A extends RestAction<?>> RequestBuilder build(A action, String securityToken) throws ActionException {
        RequestBuilder builder = super.build(action, securityToken);
        builder.setIncludeCredentials(true);
        return builder;
    }
}

I have added to my gwt.xml:

<replace-with class="com.example.rest.SecuredRequestBuilderFactory">
    <any>
        <when-type-is class="com.gwtplatform.dispatch.rest.client.core.RequestBuilderFactory"/>
        <when-type-is class="com.gwtplatform.dispatch.rest.client.core.DefaultRequestBuilderFactory"/>
    </any>
</replace-with>

I have discovered from debugger (Chrome with IDEA plugin) that there is no mapping for class SecuredRequestBuilderFactory and credentials was not included.

So, any ideas how to make it work?

1

There are 1 answers

0
Pavel Sokolov On BEST ANSWER

I found solution to pass all cookies with REST request:

SecuredRequestBuilderFactory.java:

public class SecuredRequestBuilderFactory extends DefaultRequestBuilderFactory {

    @Inject
    public SecuredRequestBuilderFactory(HttpRequestBuilderFactory httpRequestBuilderFactory, BodyFactory bodyFactory, HeaderFactory headerFactory, UriFactory uriFactory, @RequestTimeout Integer requestTimeoutMs) {
        super(httpRequestBuilderFactory, bodyFactory, headerFactory, uriFactory, requestTimeoutMs);
    }

    @Override
    public <A extends RestAction<?>> RequestBuilder build(A action, String securityToken) throws ActionException {
        RequestBuilder builder = super.build(action, securityToken);
        builder.setIncludeCredentials(true);
        return builder;
    }
}

MyRestDispatchModule.java:

public class MyRestDispatchModule extends AbstractGinModule {

    static class MyCoreModuleBuilder extends CoreModuleBuilder {
        MyCoreModuleBuilder(BaseRestDispatchModuleBuilder<?> baseBuilder) {
            super(baseBuilder);
            requestBuilderFactory(SecuredRequestBuilderFactory.class);
        }
    }

    static class MyBuilder extends RestDispatchAsyncModule.Builder {
        @Override
        public CoreModuleBuilder core() {
            return new MyCoreModuleBuilder(this);
        }
    }

    @Override
    protected void configure() {
        install(new MyBuilder().build());
    }
}