RestyGWT-自定义调度程序不会调用已注册的过滤器 [英] RestyGWT- custom dispatcher doesn't call registered filters
问题描述
我正在尝试为我的自定义调度程序编写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 ForbiddenDispatcherFilter ForbiddenDispatcherCallback
$ 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
public class ForbiddenDispatcherFilter implements DispatcherFilter {
$ b $ @Override
public boolean filter(Method方法,RequestBuilder构建器){
GWT.log( - > ForbiddenDispatcherFilter - > filter - > setCallback);
builder.setCallback(new ForbiddenDispatcherCallback(method));
返回true;
$ b
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 callbackForbiddenDispatcherCallback
)- 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屋!