2017-10-17 190 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)。這將明確注入的請求收聽。