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

Java 如何向Grizzly服务器添加过滤器?,java,authentication,redirect,grizzly,whitelist,Java,Authentication,Redirect,Grizzly,Whitelist,我创建了一个返回JSON的Grizzly服务器。它工作得很好: final ResourceConfig resourceConfig = new ResourceConfig().packages("com.mypackage"); resourceConfig.setApplicationName("My-Service"); resourceConfig.register(JacksonJaxbJsonProvider.class); server = Gr

我创建了一个返回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-proto
    http
    (位置设置为
    https
    等效位置),则响应302/重定向
  • 如果
    x-forwarded-for
    不在白名单上,则响应403/禁止
现在我像这样做这些检查:

@Path("v1")
public class Facade {

    @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-proto
x-forwarded-for
检查不是防弹的,但总比没有好。)

更新: 这是可行的,尽管它可能不是应该如何设置的:

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()中的索引。添加(-筛选器应位于HttpServerFilter之前,因为它返回停止操作。

更新: 这是可行的,尽管它可能不是应该如何设置的:

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()中的索引。添加(-筛选器应该在HttpServerFilter之前,因为它返回停止操作。

有趣,我将尝试一下!但是“您的”
传输和“我的”
服务器”
如何连接?感谢更新!现在我开始理解了。有趣的是,我将尝试一下!但是“您的”如何连接
传输
和“我的”
服务器
已连接?感谢您的更新!现在我开始理解了。