Я пытаюсь написать свой собственный диспетчер для 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)
Потому что я не нашел много об этом в документации, чтобы достичь это я основываюсь на этих примерах:
, но ничего из этого, где указано прийти. Пожалуйста помоги.