RestyGWT- custom dispatcher doesn't call registered filters

前端 未结 2 1247
日久生厌
日久生厌 2021-01-20 06:13

I am trying to write my custom dispatcher for resty gwt.

My dispatcher RestyDispatcher will contain two filters:

  • BasicAuthHeaderDi
相关标签:
2条回答
  • 2021-01-20 06:19

    My solution for this is to execute manually filter method. I don't know is it good solution. I assume that this is a bug, cause filter method should be called by RestyGWT, as it is declared in interface DispatcherFilter and implemented in DefaultFilterawareDispatcher class as follow:

    package org.fusesource.restygwt.client.dispatcher;
    public class DefaultFilterawareDispatcher implements FilterawareDispatcher {
    
       @Override
        public Request send(Method method, RequestBuilder builder) throws RequestException {
            for (DispatcherFilter f : dispatcherFilters) {
                if (!f.filter(method, builder)) {
                    // filter returned false, no continue
                    if (GWT.isClient() && LogConfiguration.loggingIsEnabled()) {
                        Logger.getLogger(DefaultFilterawareDispatcher.class.getName())
                                .fine(f.getClass() + " told me not to continue filtering for: "
                                        + builder.getHTTPMethod() + " " + builder.getUrl());
                    }
                    return null;
                }
            }
            return builder.send();
        }
    }
    

    Here is my code implemenation:

    public class ClientModule extends AbstractPresenterModule {
        @Override
        protected void configure() {
            bind(RestyGwtConfig.class).asEagerSingleton();
            install(new DefaultModule.Builder().defaultPlace(Routing.PAGE.url).errorPlace(Routing.PAGE.url).unauthorizedPlace(Routing.LOGIN.url).tokenFormatter(RouteTokenFormatter.class).build());
            install(new AppModule());
            bind(CurrentUser.class).in(Singleton.class);
            bind(IsAdminGatekeeper.class).in(Singleton.class);
            bind(UserLoginGatekeeper.class).in(Singleton.class);
        }
    }
    

    public class RestyGwtConfig {
        static {
            Defaults.setDispatcher(new RestyDispatcher());
            Defaults.setServiceRoot(new Resource(GWT.getModuleBaseURL()).resolve("../../cms/services").getUri());
        }
    }
    

    public class RestyDispatcher extends DefaultFilterawareDispatcher {
    
        public RestyDispatcher() {
            addFilter(new ForbiddenDispatcherFilter());
            addFilter(new BasicAuthHeaderDispatcherFilter());
        }
        @Override
        public Request send(Method method, RequestBuilder builder) throws RequestException {
            for (DispatcherFilter e : this.dispatcherFilters) {
                e.filter(method, builder);
            }
        return builder.send();
        }
    }
    

    Please correct me if I am wrong.

    0 讨论(0)
  • 2021-01-20 06:31

    I manually override send method in RestyDispatcher class, So my implementation have to manually execute super.send(method, builder). Or I should not override send method at all.

    So RestyDispatcher it should look like this:

    public class RestyDispatcher extends DefaultFilterawareDispatcher {
    
        public RestyDispatcher() {
            addFilter(new ForbiddenDispatcherFilter());
            addFilter(new BasicAuthHeaderDispatcherFilter());
        }
    
        @Override
        public Request send(Method method, RequestBuilder builder) throws RequestException {
             return super.send(method, builder);
        }
    
    }
    

    or

    public class RestyDispatcher extends DefaultFilterawareDispatcher {
    
        public RestyDispatcher() {
        addFilter(new ForbiddenDispatcherFilter());
        addFilter(new BasicAuthHeaderDispatcherFilter());
        }
    }
    
    0 讨论(0)
提交回复
热议问题