2009-12-30 4 views
2

У меня есть весна.Как получить IP-адрес клиента весной фасоли

<beans> 
    <bean id="remoteService" class="edu.wustl.catissuecore.CaTissueApplictionServicImpl" /> 
</beans> 

Есть ли способ получить IP-адрес клиента в этом классе? Аналогично доступному в сервлете request.getRemoteAddr();

+0

1.) Является ли это webapp или просто какое-то случайное приложение Spring? 2.) Замечательно, что edu.wustl.catissuecore.CaTissueApplictionServicImpl (или gov.nih.nci.system.comm.server.ApplicationServiceServerImpl?) * Не реализует AbstractController ... но что * делает * он реализует? Если это не сам контроллер, есть ли контроллер выше, который может передать это в этот класс? 3.) Конфигурация Spring для класса была уже размещена в главном вопросе - вам нужно опубликовать код или, по крайней мере, описать иерархию наследования и другие компоненты, с которыми взаимодействует ваш класс. – Nate

ответ

15

Самый простой (и уродливая) подход заключается в использовании RequestContextHolder:

String remoteAddress = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()) 
     .getRequest().getRemoteAddr(); 

Не зная больше о вашем боба и как это проводные вверх, то лучшее, что я могу предложить. Если ваш компонент является контроллером (либо подклассификация AbstractController, либо аннотируется @Controller), то он должен иметь возможность получить прямой доступ к объекту запроса.

+0

Нет моего компонента не наследует AbstarctController. Боб является: <боб ID =" RemoteService»класс = "gov.nih.nci.system.comm.server.ApplicationServiceServerImpl"/> Но я не являюсь получение RequestContextHolder в моем пути к классам. Я использую spring 1.2.7 – 2009-12-30 11:12:04

+1

Я запускаю свой код на локальном хосте и позже на стороне сервера. На стороне сервера он работает отлично. Но localhost - это return '0: 0: 0: 0: 0: 0: 0: 1' и даже используя' getLocalAddr() ' –

+0

" он должен иметь возможность получить прямой доступ к объекту запроса "- что это значит ? – jameshfisher

0

Construct это:

@Autowired(required = true) 
private HttpServletRequest request; 

и использовать так:

request.getRemoteAddr() 
1

Лучший способ получить IP клиента, чтобы перебрать заголовки

private static final String[] IP_HEADER_CANDIDATES = { 
     "X-Forwarded-For", 
     "Proxy-Client-IP", 
     "WL-Proxy-Client-IP", 
     "HTTP_X_FORWARDED_FOR", 
     "HTTP_X_FORWARDED", 
     "HTTP_X_CLUSTER_CLIENT_IP", 
     "HTTP_CLIENT_IP", 
     "HTTP_FORWARDED_FOR", 
     "HTTP_FORWARDED", 
     "HTTP_VIA", 
     "REMOTE_ADDR" }; 

public static String getClientIpAddress(HttpServletRequest request) { 
    for (String header : IP_HEADER_CANDIDATES) { 
     String ip = request.getHeader(header); 
     if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { 
      return ip; 
     } 
    } 
    return request.getRemoteAddr(); 
}