我创建了一个返回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,则响应302 /重定向(位置设置为等效的https
如果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-protox-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()。add(中的索引-筛选器应在HttpServerFilter导致返回STOP操作之前。

10-08 16:27