如何向Grizzly服务器添加过滤器?

时间:2017-10-03 01:02:20

标签: java authentication redirect grizzly whitelist

我创建了一个返回JSON的Grizzly服务器。它工作得很好:

    final ResourceConfig resourceConfig = new ResourceConfig().packages("com.mypackage");
    resourceConfig.setApplicationName("My-Service");
    resourceConfig.register(JacksonJaxbJsonProvider.class);
    server = GrizzlyHttpServerFactory.createHttpServer(uri, resourceConfig);

我需要过滤器

  • 检查授权标头是否包含有效密钥
  • 如果x-forwarded-protohttp(位置设置为等效的https),则回复302 /重定向
  • 如果x-forwarded-for不在白名单上
  • ,则回复403 /禁止

现在我做这样的检查:

@Path( “V1”) 公共课门面{

@GET
@Path("/getinfo/{infotype}")
@Produces(MediaType.APPLICATION_JSON)
public Response getNextPwc(@HeaderParam("authorization") String authorizationKey,
        @Context Request request, 
        @HeaderParam("x-forwarded-proto") String xForwardedProto, 
        @HeaderParam("x-forwarded-for") String xForwardedFor,
        @PathParam("infotype") String infoType) {
    Response errorResponse = getErrorResponse(authorizationKey, request, xForwardedFor, xForwardedProto);
    if (errorResponse != null) {
        return errorResponse;
    }
    ... start work with infoType here ...

它有效 - 服务器行为正常 - 但代码在错误的地方(我必须记住将它添加到所有新方法)所以我想将它移动到过滤器机制改为。

非常感谢任何帮助。

(我知道x-forwarded-protox-forwarded-for检查不是防弹,但总比没有好。)

1 个答案:

答案 0 :(得分:0)

更新: 这是有效的,虽然它可能不是应该如何设置的:

final HttpServer server = new HttpServer();

final NetworkListener networkListener = new NetworkListener(
    "secured-listener",
    "0.0.0.0",
    9191
);
server.addListener(networkListener);
server.start();

networkListener.getFilterChain().add(5, new BaseFilter(){
    @Override
    public NextAction handleRead(FilterChainContext ctx) throws IOException {
        return super.handleRead(ctx);
    }
});
System.in.read();

注意getFilterChain()中的索引.add( - 过滤器应该在HttpServerFilter之前导致它返回STOP动作。