Подтвердить что ты не робот

Как извлечь IP-адрес в Spring MVC Controller получить вызов?

Я работаю над проектом Spring MVC-контроллера, в котором я вызываю URL-адрес GET из браузера -

Ниже приведен URL-адрес, по которому я вызываю GET-вызов из браузера.

http://127.0.0.1:8080/testweb/processing?workflow=test&conf=20140324&dc=all

И ниже приведен код, в котором происходит вызов после удара в браузере -

@RequestMapping(value = "processing", method = RequestMethod.GET)
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc) {

        System.out.println(workflow);
        System.out.println(value);
        System.out.println(dc);

        // some other code
    }

Проблема: -

Теперь есть способ, я могу извлечь IP-адрес из некоторого заголовка? Значение Я хотел бы знать, с какого IP-адреса, звонок идет, что означает, кто звонит выше URL-адреса, мне нужно знать их IP-адрес. Можно ли это сделать?

4b9b3361

Ответ 1

Решение

@RequestMapping(value = "processing", method = RequestMethod.GET)
public @ResponseBody ProcessResponse processData(@RequestParam("workflow") final String workflow,
    @RequestParam("conf") final String value, @RequestParam("dc") final String dc, HttpServletRequest request) {

        System.out.println(workflow);
        System.out.println(value);
        System.out.println(dc);
        System.out.println(request.getRemoteAddr());
        // some other code
    }

Добавьте HttpServletRequest request в определение метода, а затем используйте API сервлета

Spring Документация здесь в

15.3.2.3 Поддерживаемые аргументы метода обработчика и возвращаемые типы

Handler methods that are annotated with @RequestMapping can have very flexible signatures.
Most of them can be used in arbitrary order (see below for more details).

Request or response objects (Servlet API). Choose any specific request or response type,
for example ServletRequest or HttpServletRequest

Ответ 2

Я опаздываю здесь, но это может помочь кому-то найти ответ. Обычно работает servletRequest.getRemoteAddr().

Во многих случаях пользователи вашего приложения могут получать доступ к вашему веб-серверу через прокси-сервер или, возможно, ваше приложение находится за балансировщиком нагрузки.

Таким образом, вы должны получить доступ к http-заголовку X-Forwarded-For, чтобы получить IP-адрес пользователя адрес.

например. String ipAddress = request.getHeader("X-FORWARDED-FOR");

Надеюсь, что это поможет.

Ответ 3

Вы можете получить IP-адрес статически из RequestContextHolder, как показано ниже:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
        .getRequest();

String ip = request.getRemoteAddr();

Ответ 4

Я использую такой метод, чтобы сделать это

public class HttpReqRespUtils {

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 getClientIpAddressIfServletRequestExist() {

    if (RequestContextHolder.getRequestAttributes() == null) {
        return "0.0.0.0";
    }

    HttpServletRequest request = ((ServletRequestAttributes)    RequestContextHolder.getRequestAttributes()).getRequest();
    for (String header : IP_HEADER_CANDIDATES) {
        String ipList = request.getHeader(header);
        if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) {
            String ip = ipList.split(",")[0];
            return ip;
        }
    }

    return request.getRemoteAddr();
 }

}

Ответ 5

Ниже приведен способ Spring с autowired запроса с autowired в классе @Controller:

@Autowired 
private HttpServletRequest request;

System.out.println(request.getRemoteHost());