在 Dropwizard 2.x 中注册 ContainerRequestFilter 的推荐方法是什么?
What is the recommended way of registering ContainerRequestFilter in Dropwizard 2.x?
我正在使用 dropwizard 1.3.9 并正在努力迁移到最新的 dropwizard 2.x。
现在我有一个 ContainerRequestFilter
如下所示
@Authenticate
public class BasicAuthenticator implements ContainerRequestFilter {
@Context
private HttpServletRequest servletRequest;
private final CollectorChannel collectorChannel ;
private final ConfigStore configStore;
public BasicAuthenticator(final CollectorChannel collectorChannel, final ConfigStore configStore)
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
String requestIpAddress = servletRequest.getRemoteAddr();
String requestHost = servletRequest.getRemoteHost();
logger.info("Request originates from IP {} Host {}", requestIpAddress, requestHost);
String authHeader = requestContext.getHeaderString("Authorization");
Optional<User> user = AuthUtils.getUserBasicAuth(authHeader);
if (!user.isPresent()) {
requestContext.abortWith(responseUnAuthenticated());
return;
}
if (!isAuthentic(user.get())) {
requestContext.abortWith(responseUnAuthenticated());
}
if (!isValidLiSource(requestIpAddress) && !isValidLiSource(requestHost)) {
requestContext.abortWith(responseUnauthorized());
return;
}
}
}
我注册如下
final BasicAuthenticator basicAuthenticator = new BasicAuthenticator(collectorChannel, configStore);
environment.jersey().register(basicAuthenticator);
在migration doc中提到
Migrating resource instances with field context injections to
Dropwizard 2.0 involves pushing the field into a parameter in the
desired endpoint
但是 filter()
方法没有获取上下文作为参数。有人可以让我知道在 2.x 中注册 ContainerRequestFilter
的推荐方法是什么吗?
正如上面@Paul Samostha 所指出的,也在 forum 中回答如下
Hm, the migration guide talks about resource instances but not
ContainerRequestFilters. For what it's worth I tried this out in 2.0.8
with a field-injected context and instance registration like you have
written above and it seems to work for me. HttpServletRequest is
injected and available when the filter is executed.
我正在使用 dropwizard 1.3.9 并正在努力迁移到最新的 dropwizard 2.x。
现在我有一个 ContainerRequestFilter
如下所示
@Authenticate
public class BasicAuthenticator implements ContainerRequestFilter {
@Context
private HttpServletRequest servletRequest;
private final CollectorChannel collectorChannel ;
private final ConfigStore configStore;
public BasicAuthenticator(final CollectorChannel collectorChannel, final ConfigStore configStore)
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
String requestIpAddress = servletRequest.getRemoteAddr();
String requestHost = servletRequest.getRemoteHost();
logger.info("Request originates from IP {} Host {}", requestIpAddress, requestHost);
String authHeader = requestContext.getHeaderString("Authorization");
Optional<User> user = AuthUtils.getUserBasicAuth(authHeader);
if (!user.isPresent()) {
requestContext.abortWith(responseUnAuthenticated());
return;
}
if (!isAuthentic(user.get())) {
requestContext.abortWith(responseUnAuthenticated());
}
if (!isValidLiSource(requestIpAddress) && !isValidLiSource(requestHost)) {
requestContext.abortWith(responseUnauthorized());
return;
}
}
}
我注册如下
final BasicAuthenticator basicAuthenticator = new BasicAuthenticator(collectorChannel, configStore);
environment.jersey().register(basicAuthenticator);
在migration doc中提到
Migrating resource instances with field context injections to Dropwizard 2.0 involves pushing the field into a parameter in the desired endpoint
但是 filter()
方法没有获取上下文作为参数。有人可以让我知道在 2.x 中注册 ContainerRequestFilter
的推荐方法是什么吗?
正如上面@Paul Samostha 所指出的,也在 forum 中回答如下
Hm, the migration guide talks about resource instances but not ContainerRequestFilters. For what it's worth I tried this out in 2.0.8 with a field-injected context and instance registration like you have written above and it seems to work for me. HttpServletRequest is injected and available when the filter is executed.