Em JSP, o método para obter o endereço IP do cliente é: request.getRemoteAddr(). Este método é eficaz na maioria dos casos. No entanto, o endereço IP real do cliente não pode ser obtido através de software de proxy reverso como Apache e Squid. Se for usado um software de proxy reverso, o endereço IP obtido usando o método request.getRemoteAddr() é: 127.0.0.1 ou 192.168.1.110, não o IP real do cliente.
Depois de passar pelo proxy, como uma camada intermediária é adicionada entre o cliente e o serviço, o servidor não consegue obter diretamente o IP do cliente, e a aplicação do lado do servidor não pode retornar diretamente o endereço da solicitação encaminhada ao cliente. No entanto, as informações X-FORWARDED-FOR são adicionadas às informações do cabeçalho HTTP da solicitação encaminhada. Usado para rastrear o endereço IP do cliente original e o endereço do servidor solicitado pelo cliente original. Quando acessamos index.jsp/, não é realmente nosso navegador que acessa o arquivo index.jsp no servidor. Em vez disso, o servidor proxy acessa primeiro index.jsp e o servidor proxy retorna os resultados acessados para nós. como o servidor proxy acessa index.jsp, o IP obtido por meio do método request.getRemoteAddr() em index.jsp é na verdade o endereço do servidor proxy, não o endereço IP do cliente.
Portanto, podemos criar o método um para obter o endereço IP real do cliente:
public String getRemortIP(solicitação HTTPServletRequest) {
if (request.getHeader("x-forwarded-for") == null) {
retornar request.getRemoteAddr();
}
return request.getHeader("x-encaminhado-para");
}
Método 2 para obter o endereço IP real do cliente:
public String getIpAddr(solicitação HttpServletRequest) {
String ip = request.getHeader("x-forwarded-for");
if(ip == null || ip.length() == 0 || "desconhecido".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Cliente-IP");
}
if(ip == null || ip.length() == 0 || "desconhecido".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Cliente-IP");
}
if(ip == null || ip.length() == 0 || "desconhecido".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
retornar IP;
}
No entanto, se um proxy reverso multinível for passado, o valor de X-Forwarded-For não será apenas um, mas uma série de valores de IP. Qual deles é o IP real do cliente real?
A resposta é pegar a primeira string IP válida não desconhecida em X-Forwarded-For. como:
X-Encaminhado para: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
O IP real do usuário é: 192.168.1.110