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?
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
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.
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();
}
}
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();
Ci-dessous, la méthode Spring, avec autowired
bean request dans @Controller
classe:
@Autowired
private HttpServletRequest request;
System.out.println(request.getRemoteHost());
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;
}