我创建了一个返回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
,则响应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-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()。add(中的索引-筛选器应在HttpServerFilter导致返回STOP操作之前。