我正在尝试为resty gwt编写我的自定义调度程序。
我的dispatcher将包含两个过滤器:
我有一个问题,我的过滤器是由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博客
但这些都不应该详细说明。请帮忙。
我的解决方案是手动执行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();
}
}
如果我错了,请纠正我。
匿名用户
我在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并检查请求标头中的身份验证令牌,如果有效,则将其传递给控制器,否则会抛