2016-02-11 8 views
3

Я пытаюсь написать свой собственный диспетчер для resty gwt.RestyGWT- пользовательский диспетчер не вызывает зарегистрированные фильтры

Моего диспетчерских RestyDispatcher будут содержать два фильтра:

  • BasicAuthHeaderDispatcherFilter (который добавит к каждой лексеме запроса безопасности)
  • ForbiddenDispatcherFilter (который будет содержит обратный вызов ForbiddenDispatcherCallback) - его работа состоит в том, чтобы перенаправить на странице входа если пользователь не авторизовался.

У меня проблема, что мои фильтры зарегистрированы gwt/restygwt, к сожалению, они не работают.

Вот код:

модуль джин клиент

public class ClientModule extends AbstractPresenterModule { 
    @Override 
    protected void configure() { 
    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(UserLoginGatekeeper.class).in(Singleton.class); 

    // Load and inject CSS resources 
    bind(ResourceLoader.class).asEagerSingleton(); 

    bind(RestyGwtConfig.class).asEagerSingleton(); 
    } 

} 

RestyGwtConfig

public class RestyGwtConfig { 
    public RestyGwtConfig() { 
    final Dispatcher dispatcher = new RestyDispatcher(); 
    GWT.log("--> RestyGwtConfig -> setDispatcher"); 
    Defaults.setDispatcher(dispatcher); 

    UserCredentials.INSTANCE.setUserName("ronan"); 
    UserCredentials.INSTANCE.setPassword("password"); 
    } 

    static { 
    GWT.log("--> RestyGwtConfig -> setServiceRoot"); 
    Defaults.setServiceRoot(new Resource(GWT.getModuleBaseURL()).resolve("../../cms/services").getUri()); 
    } 

} 

RestyDispatcher

public class RestyDispatcher extends DefaultFilterawareDispatcher { 

    public RestyDispatcher() { 
    addFilter(new ForbiddenDispatcherFilter()); 
    GWT.log("--> RestyDispatcher -> RestyDispatcher -> addFilter -> ForbiddenDispatcherFilter"); 
    addFilter(new BasicAuthHeaderDispatcherFilter()); 
    GWT.log("--> RestyDispatcher -> RestyDispatcher -> addFilter -> BasicAuthHeaderDispatcherFilter"); 
    } 

    @Override 
    public Request send(Method method, RequestBuilder builder) throws RequestException { 
    GWT.log("SimpleDispatcher.Request.send.start"); 
    Request send = builder.send(); 
    GWT.log("SimpleDispatcher.Request.send.done"); 

    return send; 
    } 

} 

ForbiddenDispatcherFilter

public class ForbiddenDispatcherFilter implements DispatcherFilter { 

    @Override 
    public boolean filter(Method method, RequestBuilder builder) { 
    GWT.log("--> ForbiddenDispatcherFilter -> filter -> setCallback"); 
    builder.setCallback(new ForbiddenDispatcherCallback(method)); 
    return true; 
    } 

} 

ForbiddenDispatcherCallback

public class ForbiddenDispatcherCallback implements RequestCallback { 
    protected RequestCallback requestCallback; 

    public ForbiddenDispatcherCallback(Method method) { 
    GWT.log("_________> ForbiddenDispatcherCallback " + method.toString()); 

    this.requestCallback = method.builder.getCallback(); 
    } 

    @Override 
    public void onResponseReceived(Request request, Response response) { 
    GWT.log("_________> ForbiddenDispatcherCallback -> onResponseReceived"); 

    GWT.log(response.getStatusText() + response.getStatusCode()); 
    if (response.getStatusCode() == Response.SC_FORBIDDEN || response.getStatusCode() == Response.SC_UNAUTHORIZED) { 
     // make a hard redirect to login page 
     Window.Location.assign("#/login"); 
    } else { 
     requestCallback.onResponseReceived(request, response); 
    } 

    } 

    @Override 
    public void onError(Request request, Throwable exception) { 
    GWT.log("_________> ForbiddenDispatcherCallback -> onError"); 
    requestCallback.onError(request, exception); 
    } 

} 

BasicAuthHeaderDispatcherFilter

final class BasicAuthHeaderDispatcherFilter implements DispatcherFilter { 

    public static final String AUTHORIZATION_HEADER = "Authorization"; 

    @Override 
    public boolean filter(Method method, RequestBuilder builder) { 
    String basicAuthHeaderValue = createBasicAuthHeader(UserCredentials.INSTANCE.getUserName(), UserCredentials.INSTANCE.getPassword()); 
    builder.setHeader(AUTHORIZATION_HEADER, basicAuthHeaderValue); 

    return true; 
    } 

    private String createBasicAuthHeader(String userName, String password) { 
    String credentials = userName + ":" + password; 
    String encodedCredentials = credentials; 
    return AUTHORIZATION_HEADER + ": Basic " + encodedCredentials; 

    } 
} 

Когда я бегу приложение я получаю это журналы в консоли веб-браузера:

--> RestyGwtConfig -> setServiceRoot 
SuperDevModeLogger.java:71--> RestyDispatcher -> RestyDispatcher -> addFilter -> ForbiddenDispatcherFilter 
SuperDevModeLogger.java:71--> RestyDispatcher -> RestyDispatcher -> addFilter -> BasicAuthHeaderDispatcherFilter 
SuperDevModeLogger.java:71--> RestyGwtConfig -> setDispatcher 

Так я предполагаю, что мой грузоотправитель, ти делает 2 фильтра правильно зарегистрирован. К сожалению, я не вижу журнала от ForbiddenDispatcherFilter, говоря, что он установил мой обратный вызов ForbiddenDispatcherCallback. Я также не вижу никакого журнала из упомянутого обратного вызова.

Когда я выполняю какую-либо услугу Resty, я получаю журналы регистрации:

SimpleDispatcher.Request.send.start SuperDevModeLogger.java:71

SimpleDispatcher.Request.send.done XMLHttpRequest.java:305

POST http://localhost:8080/cms/services/authenticated/testService/setInfo 401 (Unauthorized)

Потому что я не нашел много об этом в документации, чтобы достичь это я основываюсь на этих примерах:

, но ничего из этого, где указано прийти. Пожалуйста помоги.

ответ

1

Я вручную переопределяю метод send в классе RestyDispatcher, поэтому моей реализации необходимо выполнить вручную super.send(method, builder). Или я не должен переопределять метод send.

Так RestyDispatcher он должен выглядеть следующим образом:

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); 
    } 

} 

или

public class RestyDispatcher extends DefaultFilterawareDispatcher { 

    public RestyDispatcher() { 
    addFilter(new ForbiddenDispatcherFilter()); 
    addFilter(new BasicAuthHeaderDispatcherFilter()); 
    } 
} 
0

Моим решением для этого является выполнение вручную метода filter. Я не знаю, это хорошее решение. Я предполагаю, что это ошибка, причина filter метод должен быть вызван RestyGWT, поскольку он объявлен в interface DispatcherFilter и реализован в DefaultFilterawareDispatcher классе следующим образом:

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(); 
    } 
} 

Вот мой код реализации внешних:

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(); 
    } 
} 

Пожалуйста, исправьте меня, если я ошибаюсь.

 Смежные вопросы

  • Нет связанных вопросов^_^