Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RestyGWT-自定义调度程序不';t调用已注册的筛选器_Java_Gwt_Resty Gwt - Fatal编程技术网

Java RestyGWT-自定义调度程序不';t调用已注册的筛选器

Java RestyGWT-自定义调度程序不';t调用已注册的筛选器,java,gwt,resty-gwt,Java,Gwt,Resty Gwt,我正在尝试为resty gwt编写自定义调度程序 我的dispatcherRestyDispatcher将包含两个筛选器: 基本CauthHeaderDispatcherFilter(将添加到每个请求安全令牌) 禁止DispatcherFilter(其中将包含回调禁止DispatcherCallback)-如果用户未登录,他的任务是重定向到登录页面 我有一个问题,我的过滤器是由gwt/restygwt注册的,不幸的是它们不能工作 以下是代码: gin客户端模块 public class Cl

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

我的dispatcher
RestyDispatcher
将包含两个筛选器:

  • 基本CauthHeaderDispatcherFilter
    (将添加到每个请求安全令牌)
  • 禁止DispatcherFilter
    (其中将包含回调
    禁止DispatcherCallback
    )-如果用户未登录,他的任务是重定向到登录页面
我有一个问题,我的过滤器是由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;
    }

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

    }
}
禁止DispatcherFilter

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

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

    }
}
禁止DispatcherCallback

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

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

}
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
中的日志说它设置了我的回调
禁止DispatcherCallback
。我也没有看到任何提到的回调日志

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

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

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

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

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


但这一切都没有得到足够的说明。请提供帮助。

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



如果我错了,请更正。

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

}