2017-10-17 191 views
0

我在新泽西州2.26以下RequestEventListener:Get请求IP泽西请求事件监听器

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请求对象,当我使用RequestFilter而不是一个事件监听其工作原理类似。但是我得到关于request对象的NullPointerException。

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

由于提前, 罗布

回答

0

可能是因为你只是将其实例化。你不能指望它被这样注入。你可以做的是注入它(Provider<Request>ApplicationEventListener,并将它传递的请求收听构造。或者你可以注入ServiceLocatorInjectionManager为2.26+)到ApplicationEventListener并调用locator.inject(requestListener)。这将明确注入的请求收听。