2010-04-23 51 views
2

如何在JSR168 Portlet中獲取客戶端的IP(請求)?如何在JSR168 Portlet中獲取客戶端IP?

我對Liferay的5.2.3

我可以用Liferay的內部功能獲得IP:

String ip = com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr(); 

有任何門戶中立的方式做到這一點?

+0

您是否發現了任何JSR-ish方法? – 2010-08-16 18:22:56

+0

@Alexandru:不,我認爲沒有辦法做到這一點「JSR168符合」 – 2010-08-17 04:57:49

回答

1

嗯,單程...如果在您的Portlet中使用Spring MVC,您將可以訪問相同的servlet請求並獲得客戶端IP。我沒有方便的代碼,但是如果您使用ActionRequest或HTTPservlet請求來向您的控制器類添加代碼。這應該以非Liferay方式爲您提供。

-1

對不起,我不打算在這裏回答你的問題,但添加一些你可能不想獲得IP地址的原因。對於某些設置而言,通常來自一個客戶端的請求來自多個IP地址:它們可能位於負載均衡器之後,捆綁具有不同外部IP地址的某些連接,或者可能隱藏在代理服務器場之後,每個代理服務器用不同的地址。

此外,使用代理或涉及NAT,您可能會從同一個IP地址獲得多個客戶端。

因此:如果您使用客戶端地址進行身份驗證,請格外小心:您可能需要一個客戶端有多個地址,或者一個地址需要多個客戶端。另外,您可以擁有多個來自(相同)多個地址的客戶端。我見過很多關於客戶端地址的危險假設。

保重!

1
java.lang.reflect.Field f = request.getClass().getDeclaredField("_request "); 
f.setAccessible(true) ;//make visiable 
HttpServletRequest httpServletRequest = (HttpServletRequest) f.get(request); get Request 

String ip = httpServletRequest.getHeader("x-forwarded-for"); 
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = httpServletRequest.getHeader("Proxy-Client-IP"); 
} 
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = httpServletRequest.getHeader("WL-Proxy-Client-IP"); 
} 
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
    ip = httpServletRequest.getRemoteAddr(); 
} 
System.out.println("ip:="+ip);