java - RestyGWT-自定义调度程序不调用已注册的过滤器

标签 java gwt resty-gwt

我正在尝试为 resty gwt 编写自定义调度程序。

我的调度器 RestyDispatcher 将包含两个过滤器:

  • BasicAuthHeaderDispatcherFilter(将添加到每个请求安全 token ),
  • ForbiddenDispatcherFilter(将包含回调 ForbiddenDispatcherCallback)- 他的工作是在用户未登录时重定向到登录页面。

我有问题,我的过滤器是由 gwt/restygwt 注册的,不幸的是它们不起作用。

代码如下:

gin 客户端模块

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;

    }
}

当我运行应用程序时,我在 Web 浏览器控制台中得到以下日志:

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

所以我假设我的 Dispatcher 和 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(未授权)

因为我没有在文档中找到太多关于它的信息,为了实现这一点,我基于这些示例:

但这些都没有指定足够的地方。请帮忙。

最佳答案

我在 RestyDispatcher 类中手动覆盖了 send 方法,所以我的实现必须手动执行 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());
    }
}

关于java - RestyGWT-自定义调度程序不调用已注册的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35349799/

相关文章:

java - 静态方法 vs 非静态方法 java 更好的理解

java - Spring MVC 不使用 angularjs 指令渲染 html

java - 如何使用输出流UTF-8将数据写入数据库

java - GWT- CellTable--设置行突出显示的问题

java - RestyGWT 和 GWT 集成

json - RestyGWT - JsonEncoderDecoder 是否可以使用列表?

rest - 使用 RestyGWT Rest 服务进行基本身份验证?

java - Spring MVC UTF-8 编码

java - 对象化条件更新事务模式

java - gwt-maven-plugin 失败并出现 NullPointerException