Estou trabalhando no projeto do controlador Spring MVC no qual estou fazendo uma chamada GET URL do navegador -
Abaixo está o url pelo qual estou fazendo uma chamada GET do navegador -
http://127.0.0.1:8080/testweb/processing?workflow=test&conf=20140324&dc=all
E abaixo está o código em que a chamada vem depois de acessar o navegador -
@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
}
Declaração do problema: -
Agora, há alguma maneira de extrair o endereço IP de algum cabeçalho? Significa que gostaria de saber de qual endereço IP a chamada está vindo, ou seja, quem está ligando acima do URL, preciso saber seu endereço IP. Isso é possível fazer?
java
spring-mvc
ip-address
John
fonte
fonte
Respostas:
A solução é
@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 }
Adicione
HttpServletRequest request
à sua definição de método e, em seguida, use a API ServletA documentação da primavera aqui disse em
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
fonte
Estou atrasado aqui, mas isso pode ajudar alguém que esteja procurando a resposta. Normalmente
servletRequest.getRemoteAddr()
funciona.Em muitos casos, os usuários do seu aplicativo podem estar acessando seu servidor da web por meio de um servidor proxy ou talvez seu aplicativo esteja atrás de um balanceador de carga.
Portanto, você deve acessar o cabeçalho X-Forwarded-For http nesse caso para obter o endereço IP do usuário.
por exemplo
String ipAddress = request.getHeader("X-FORWARDED-FOR");
Espero que isto ajude.
fonte
X-Forwarded-For
geralmente é uma lista separada por vírgulas de ips, com cada proxy na cadeia adicionando o endereço remoto que vê à lista. Portanto, uma boa implementação geralmente teria uma lista de proxies confiáveis e "pularia" esses ips ao ler este cabeçalho da direita para a esquerda.RemoteIpValve
analisa oX-Forwarded-For
cabeçalho e o define noHttpServletRequest
, de modo queservletRequest.getRemoteAddr()
retorna o endereço IP correto do usuário final. No Spring Boot pode ser habilitado através daserver.tomcat.remote-ip-header=X-Forwarded-For
propriedade do aplicativoEu uso esse método para fazer isso
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(); } }
fonte
Você pode obter o endereço IP estaticamente a partir do
RequestContextHolder
seguinte:fonte
Coloque este método em seu 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; }
fonte
Ver abaixo. Este código funciona com spring-boot e spring-boot + apache CXF / SOAP.
// in your class RequestUtil private static final String[] IP_HEADER_NAMES = { "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 getRemoteIP(RequestAttributes requestAttributes) { if (requestAttributes == null) { return "0.0.0.0"; } HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest(); String ip = Arrays.asList(IP_HEADER_NAMES) .stream() .map(request::getHeader) .filter(h -> h != null && h.length() != 0 && !"unknown".equalsIgnoreCase(h)) .map(h -> h.split(",")[0]) .reduce("", (h1, h2) -> h1 + ":" + h2); return ip + request.getRemoteAddr(); } //... in service class: String remoteAddress = RequestUtil.getRemoteIP(RequestContextHolder.currentRequestAttributes());
:)
fonte
Abaixo está o método Spring, com o
autowired
bean de solicitação na@Controller
classe:@Autowired private HttpServletRequest request; System.out.println(request.getRemoteHost());
fonte
@Controller
instâncias usando@Autowired
. Caso contrário, você deve usar@Scope(BeanDefinition.SCOPE_PROTOTYPE)
na classe do controlador para garantir que uma nova instância do controlador seja feita com cada solicitação. Isso é menos eficiente, mas é uma solução alternativa se você precisar injetar algo como uma propriedade na classe do controlador.No meu caso, estava usando o Nginx na frente do meu aplicativo com a seguinte configuração:
location / { proxy_pass http://localhost:8080/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; add_header Content-Security-Policy 'upgrade-insecure-requests'; }
então, em meu aplicativo, obtenho o ip do usuário real assim:
String clientIP = request.getHeader("X-Real-IP");
fonte
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 getIPFromRequest(HttpServletRequest request) { String ip = null; if (request == null) { if (RequestContextHolder.getRequestAttributes() == null) { return null; } request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } try { ip = InetAddress.getLocalHost().getHostAddress(); } catch (Exception e) { e.printStackTrace(); } if (!StringUtils.isEmpty(ip)) return ip; for (String header : IP_HEADER_CANDIDATES) { String ipList = request.getHeader(header); if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) { return ipList.split(",")[0]; } } return request.getRemoteAddr(); }
Combino o código acima para que este código funcione na maioria dos casos. Passe o que
HttpServletRequest request
você obtém da api para o métodofonte