2016-02-11 51 views
3

我正在尝试为自己的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; 

    } 
} 

当我运行应用程序,我在Web浏览器控制台中看到此日志:

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

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

如果我错了,请纠正我。

相关问题