RestyGWT-自定义调度程序不会调用已注册的过滤器 [英] RestyGWT- custom dispatcher doesn't call registered filters

查看:96
本文介绍了RestyGWT-自定义调度程序不会调用已注册的过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



我的调度程序 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(新的AppModule());

bind(CurrentUser.class).in(Singleton.class);
bind(UserLoginGatekeeper.class).in(Singleton.class);

//加载并注入CSS资源
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

$ p $ public class RestyDispatcher extends DefaultFilterawareDispatcher {
$ b $ public RestyDispatcher(){
addFilter(新的ForbiddenDispatcherFilter());
GWT.log( - > RestyDispatcher - > RestyDispatcher - > addFilter - > ForbiddenDispatcherFilter);
addFilter(new BasicAuthHeaderDispatcherFilter());
GWT.log( - > RestyDispatcher - > RestyDispatcher - > addFilter - > BasicAuthHeaderDispatcherFilter);

$ b @Override
公共请求发送(方法方法,RequestBuilder构建器)throws RequestException {
GWT.log(SimpleDispatcher.Request.send.start) ;
请求发送= builder.send();
GWT.log(SimpleDispatcher.Request.send.done);

返回发送;




$ b

ForbiddenDispatcherFilter

  public class ForbiddenDispatcherFilter implements DispatcherFilter {
$ b $ @Override
public boolean filter(Method方法,RequestBuilder构建器){
GWT.log( - > ForbiddenDispatcherFilter - > filter - > setCallback);
builder.setCallback(new ForbiddenDispatcherCallback(method));
返回true;




$ b

ForbiddenDispatcherCallback

  public class ForbiddenDispatcherCallback实现RequestCallback {
受保护的RequestCallback requestCallback;
$ b $ public public ForbiddenDispatcherCallback(Method method){
GWT.log(_________> ForbiddenDispatcherCallback+ method.toString());

this.requestCallback = method.builder.getCallback();

$ b @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){
//使硬重定向到登录页面
Window.Location .assign( #/登录);
} else {
requestCallback.onResponseReceived(request,response);



$ @Override
public void onError(Request request,Throwable exception){
GWT.log(_________> ForbiddenDispatcherCallback - > onError);
requestCallback.onError(request,exception);




$ b BasicAuthHeaderDispatcherFilter

  final class BasicAuthHeaderDispatcherFilter implements DispatcherFilter {

public static final String AUTHORIZATION_HEADER =Authorization;
$ b $ @Override
public boolean filter(Method method,RequestBuilder builder){
String basicAuthHeaderValue = createBasicAuthHeader(UserCredentials.INSTANCE.getUserName(),UserCredentials.INSTANCE.getPassword()) ;
builder.setHeader(AUTHORIZATION_HEADER,basicAuthHeaderValue);

返回true;
}

private String createBasicAuthHeader(String userName,String password){
String credentials = userName +:+ password;
字符串encodedCredentials =凭证;
返回AUTHORIZATION_HEADER +:Basic+ encodedCredentials;


$ b

当我运行应用程序时,登入网页浏览器控制台:

   - > 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(Unauthorized)



原因我在文档中没有发现太多内容,我基于这些例子:



但没有指定足够的值。

解决方案

手动覆盖 send 方法< $ c> RestyDispatcher class,所以我的实现必须手动执行 super.send(method,builder)。或者我不应该重写 send 方法。



所以 RestyDispatcher 应该看起来像这样:

  public class RestyDispatcher extends DefaultFilterawareDispatcher {
$ b $ public RestyDispatcher(){
addFilter(new ForbiddenDispatcherFilter());
addFilter(new BasicAuthHeaderDispatcherFilter());

$ b @Override
public请求发送(Method method,RequestBuilder builder)throws RequestException {
return super.send(method,builder);
}

}

  public class RestyDispatcher extends DefaultFilterawareDispatcher {

public RestyDispatcher(){
addFilter(new ForbiddenDispatcherFilter());
addFilter(new BasicAuthHeaderDispatcherFilter());
}
}


I am trying to write my custom dispatcher for resty gwt.

My dispatcher RestyDispatcher will contain two filters:

  • BasicAuthHeaderDispatcherFilter (which will add to each request security token),
  • ForbiddenDispatcherFilter (which will contains callback ForbiddenDispatcherCallback)- his job is to redirect to login page if user is not logged in.

I have problem, that my filters are registered by gwt/restygwt, unfortunatelly they don't work.

Here is code:

gin client module

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;

    }
}

When I run app I get this logs in web browser console:

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

So I assume that my Dispatcher, whith does 2 filters is registered correctly. Unfortunatelly I do not see log from ForbiddenDispatcherFilter saying that it set my callback ForbiddenDispatcherCallback. I also don't see any log from mentioned callback.

When I execute any resty service, I am getting logs entries:

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)

Cause I didn't found much about it in documentation, To achieve this I've base on those examples:

but none of this where enought specified. Please help.

解决方案

I manually override send method in RestyDispatcher class, So my implementation have to manually execute super.send(method, builder). Or I should not override send method at all.

So RestyDispatcher it should look like this:

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

}

or

public class RestyDispatcher extends DefaultFilterawareDispatcher {

    public RestyDispatcher() {
    addFilter(new ForbiddenDispatcherFilter());
    addFilter(new BasicAuthHeaderDispatcherFilter());
    }
}

这篇关于RestyGWT-自定义调度程序不会调用已注册的过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆