No JSP, o método para obter o endereço IP do cliente é: request.getRemoteaddr (), que é válido na maioria dos casos. No entanto, depois de passar no Apache, Squid e outro software de proxy reverso, você não pode obter o endereço IP real do cliente. Se o software proxy reverso for usado, o endereço IP obtido usando o método do request.getRemoTeaddr () é: 127.0.0.1 ou 192.168.1.110, não o IP real do cliente.
Depois de passar o proxy, uma vez que uma camada intermediária é adicionada entre o cliente e o serviço, o servidor não pode obter diretamente o IP do cliente e o aplicativo do lado do servidor não pode retornar diretamente ao cliente através do endereço de encaminhamento. No entanto, nas informações do cabeçalho HTTP do encaminhamento da solicitação, as informações X-forward-for são adicionadas. Usado para rastrear o endereço IP do cliente original e o endereço do servidor solicitado pelo cliente original. Quando acessarmos o index.jsp/, não é que nosso navegador realmente acesse o arquivo index.jsp no servidor. Em vez disso, o servidor proxy acessa o index.jsp e o servidor proxy retorna o resultado acessado ao nosso navegador. Como o servidor proxy acessa index.jsp, o IP obtido pelo método request.getRemoteaddr () no index.jsp é na verdade o endereço do servidor proxy, não o endereço IP do cliente.
Portanto, um método para obter o endereço IP real do cliente pode ser obtido:
public string getRemortip (httpServletRequest request) {if (request.getheader ("x-forwarded for") == null) {return request.getRemoTeaddr (); } Return request.getheader ("X-forwarded for"); }Método 2 Para obter o endereço IP real do cliente:
public string getipaddr (httpServletRequest Request) {string ip = request.getheader ("x-forwarded for"); if (ip == null || ip.length () == 0 || "desconhecido" .equalsignorecase (ip)) {ip = request.getheader ("proxy-client-ip"); } if (ip == null || ip.length () == 0 || "desconhecido" .equalsignorecase (ip)) {ip = request.getheader ("wl-proxy-client-ip"); } if (ip == null || ip.length () == 0 || "desconhecido" .equalsignorecase (ip)) {ip = request.getRemoTeaddr (); } retornar ip; }No entanto, se um proxy reverso de vários níveis for passado, haverá mais de um valor de X-forwarded-for, mas uma série de valores de IP. Qual é o IP real do lado do usuário real?
A resposta é pegar a primeira string IP válida não abrangente em X-forwarded. como:
X-forwarded for: 192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
O verdadeiro IP do usuário é: 192.168.1.110