web-dev-qa-db-fra.com

Comment extraire une adresse IP dans Spring MVC Controller get call?

Je travaille sur un projet de contrôleur Spring MVC dans lequel je passe un appel URL GET à partir du navigateur -

Vous trouverez ci-dessous l'URL par laquelle je passe un appel GET à partir du navigateur -

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

Et ci-dessous est le code dans lequel l'appel vient après avoir frappé sur le navigateur -

@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
    }

Énoncé du problème: -

Maintenant, y a-t-il un moyen, je peux extraire l'adresse IP d'un en-tête? Signification Je voudrais savoir de quelle adresse IP l'appel provient, ce qui signifie que celui qui appelle au-dessus de l'URL, j'ai besoin de connaître son adresse IP. Est-ce possible?

63
john

La solution est

@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
    }

Ajouter HttpServletRequest request à la définition de votre méthode, puis utilisez l'API Servlet

Documentation de printemps ici dit dans

15.3.2.3 Arguments de méthode de gestionnaire pris en charge et types de retour

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
105
Koitoer

Je suis en retard ici, mais cela pourrait aider quelqu'un qui cherche la réponse. Généralement, servletRequest.getRemoteAddr() fonctionne.

Dans de nombreux cas, les utilisateurs de votre application peuvent accéder à votre serveur Web via un serveur proxy ou votre application est peut-être derrière un équilibreur de charge.

Vous devez donc accéder à l'en-tête X-Forwarded-For http afin d'obtenir l'adresse IP de l'utilisateur.

par exemple. String ipAddress = request.getHeader("X-FORWARDED-FOR");

J'espère que cela t'aides.

93
sunitkatkar

J'utilise une telle méthode pour le faire

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();
 }

}

7
panser

Vous pouvez obtenir l'adresse IP de manière statique à partir de RequestContextHolder comme ci-dessous:

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

String ip = request.getRemoteAddr();
7
Radouane ROUFID

Ci-dessous, la méthode Spring, avec autowired bean request dans @Controller classe:

@Autowired 
private HttpServletRequest request;

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

Mettez cette méthode dans votre BaseController:

@SuppressWarnings("ConstantConditions")
protected String fetchClientIpAddr() {
    HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.getRequestAttributes())).getRequest();
    String ip = Optional.ofNullable(request.getHeader("X-FORWARDED-FOR")).orElse(request.getRemoteAddr());
    if (ip.equals("0:0:0:0:0:0:0:1")) ip = "127.0.0.1";
    Assert.isTrue(ip.chars().filter($ -> $ == '.').count() == 3, "Illegal IP: " + ip);
    return ip;
}
0
BaiJiFeiLong