当前位置: 首页 > 知识库问答 >
问题:

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

梁丘弘
2023-03-14

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

我的dispatcher将包含两个过滤器:

  • 基本CauthHeaderDispatcherFilter(将添加到每个请求安全令牌),

我有一个问题,我的过滤器是由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;
    }

}

禁止调度过滤器

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

}

禁止调度员回调

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

因此,我假设我的调度程序(有两个过滤器)已正确注册。不幸的是,我没有看到来自禁用DispatcherFilter的日志,它说它设置了我的回调。我也没有看到上述回调的任何日志。

当我执行任何resty服务时,我会收到日志条目:

SimpleDispatcher。要求邮寄启动SuperDevModeloger。java:71

SimpleDispatcher。要求邮寄完成XMLHttpRequest。java:305

POSThttp://localhost:8080/cms/services/authenticated/testService/setInfo401(未经授权)

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

  • ars-codia博客
  • ronanquillevere博客

但这些都不应该详细说明。请帮忙。


共有2个答案

刘承悦
2023-03-14

我的解决方案是手动执行filter方法。我不知道这是一个好的解决方案。我假设这是一个bug,因为RestyGWT应该调用filter方法,正如它在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();
    }
}

如果我错了,请纠正我。

聂和宜
2023-03-14
匿名用户

我在RestyDispatcher类中手动重写了send方法,所以我的实现必须手动执行super。发送(方法,生成器)。或者我根本不应该重写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());
    }
}

 类似资料:
  • 问题内容: 我正在尝试为resty gwt编写我的自定义调度程序。 我的调度程序将包含两个过滤器: (将添加到每个请求安全令牌中), (将包含回调)-如果用户未登录,他的工作是重定向到登录页面。 我有问题,我的过滤器是由gwt / restygwt注册的,不幸的是它们不起作用。 这是代码: 杜松子酒客户端模块 RestyGwtConfig RestyDispatcher ForbiddenDisp

  • 当我测试自定义调度程序,但我的POD状态仍然挂起。https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ 我做了一个新的自定义调度器和3个像k8s样例yaml的测试pods,但是,使用'default-scheduler'的pods工作得很好,但是使用'my-scheduler'的pods

  • 我有一个类,它通过实现中的和方法来实现自定义Kryo序列化程序(请参见下面的示例)。如何用Spark注册此自定义序列化程序? 现在在Spark: 不幸的是,Spark没有给我注册自定义序列化程序的选项。你知道有没有办法做到这一点?

  • 在我的Spring Boot项目中,我创建了一个自定义注释,其中validator扩展了ConstraintValidator,以验证RequestBody中的一些字段。注释对于非嵌套字段可以很好地工作,但对于嵌套字段不调用验证器。 我的注释如下所示: 我的验证类: 它在这样的情况下工作正常: 但是当放在嵌套对象上时,不会调用验证器: 类在我的中的用法: 关于如何解决这个问题有什么想法吗?我已经尝

  • 下面是我在网络上的配置。xml和我有一个JwtFilter,但当调用rest URL时,它无法访问。 网状物xml 这是我的JwtFilter } 我有基本的RestAPI混淆的控制器。我正在尝试检查是否有任何URL像localhost:8080/portal/lola/getData一样被击中...它应该转到JwtFilter并检查请求标头中的身份验证令牌,如果有效,则将其传递给控制器,否则会抛