在Jersey请求事件监听器中获取请求IP

时间:2017-10-17 15:53:19

标签: java jersey jax-rs jersey-2.0

我在Jersey 2.26中有以下RequestEventListener:

package com.myapp.webservice;

import org.glassfish.grizzly.http.server.Request;
import org.glassfish.jersey.server.monitoring.RequestEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.core.Context;

public class RequestEventListener implements org.glassfish.jersey.server.monitoring.RequestEventListener {
    private static final Logger logger = LoggerFactory.getLogger(RequestEventListener.class);
    private final long startTime;

    @Context
    private javax.inject.Provider<Request> request;

    RequestEventListener() {
        startTime = System.currentTimeMillis();
    }

    @Override
    public void onEvent(RequestEvent requestEvent) {
        switch(requestEvent.getType()) {
            case RESOURCE_METHOD_START:
                try {
                    logger.info("HTTPRequest {} /{} {}", requestEvent.getContainerRequest().getMethod(), requestEvent.getContainerRequest().getUriInfo().getPath(), request.get().getRemoteAddr());
                } catch (Exception e) {
                    logger.error("Exception {}", e);
                }
                break;

            case FINISHED:
                logger.info("HTTPResponse {} /{} {}", requestEvent.getContainerResponse().getLength(), requestEvent.getContainerRequest().getUriInfo().getPath(), System.currentTimeMillis() - startTime);
                break;
        }
    }
}

我尝试注入一个灰熊的http Request对象,当我使用RequestFilter而不是EventListener时,它就像那样工作。但是我得到关于request对象的NullPointerException。

是否可以在RequestEventListener中以该(或任何其他)方式获取请求的IP地址?

提前致谢, 罗布

1 个答案:

答案 0 :(得分:0)

可能是因为你只是在实例化它。你不能指望它以这种方式注入。您可以做的是将它(Provider<Request>注入ApplicationEventListener并将其传递给请求侦听器构造函数。或者您可以将ServiceLocatorInjectionManager注入2.26 +) ApplicationEventListener并调用locator.inject(requestListener)。这将明确地注入请求侦听器。