tomcat中如何獲取客戶端真實(shí)的IP

2015-08-14 16:12:20來源:威易網(wǎng)作者:joe

有時(shí)候我們需要需要獲得客戶端真實(shí)的IP,例如認(rèn)證。一般情況下,在tomcat中獲得HTTP訪問時(shí)客戶端的IP方法如下:

有時(shí)候我們需要需要獲得客戶端真實(shí)的IP,例如認(rèn)證。

一般情況下,在tomcat中獲得HTTP訪問時(shí)客戶端的IP方法如下:

httpServletRequest.getRemoteHost()

然而,經(jīng)常我們會(huì)配置Apache或nginx代理,這時(shí)候就通過上面的方法就無法獲得真實(shí)的客戶端IP。通過nginx代理,通過httpServletRequest.getRemoteHost()獲得是代理服務(wù)器的地址,Apache是客戶端真實(shí)的IP。

nginx下的配置

對(duì)于nginx,我們可以通過一下配置:

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $remote_addr;

這樣,在HTTP的header中就增加了一個(gè)X-Forwarded-For,這個(gè)保存著客戶端的真實(shí)IP,然后在tomcat中通過以下方法:

String host = httpServletRequest.getHeader("X-Forwarded-For");

host = null == host ? httpServletRequest.getRemoteHost() : host;

Apache下的配置

通過Apache代理時(shí),Apache會(huì)自動(dòng)增加X-Forwarded-For作為客戶端的IP,但這個(gè)IP雖然是客戶端IP,但不是客戶端真實(shí)的IP,如果客戶端在內(nèi)網(wǎng),這個(gè)IP則是客戶端內(nèi)網(wǎng)的IP,為了解決這個(gè)問題,在Apache代理前激將X-Forwarded-For禁止,這樣依舊可以通過httpServletRequest.getRemoteHost()獲得客戶端的真實(shí)IP。由于Tomcat中無法知道是通過Apache代理還是nginx代理,所有,還是通過上面的方式進(jìn)行IP的獲得。Apache的配置如下:

RequestHeader unset X-Forwarded-For

這樣就可以解決獲取IP的問題。

關(guān)鍵詞:tomcat