如何在JSR168 Portlet中獲取客戶端的IP(請求)?如何在JSR168 Portlet中獲取客戶端IP?
我對Liferay的5.2.3
我可以用Liferay的內部功能獲得IP:
String ip = com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr();
有任何門戶中立的方式做到這一點?
如何在JSR168 Portlet中獲取客戶端的IP(請求)?如何在JSR168 Portlet中獲取客戶端IP?
我對Liferay的5.2.3
我可以用Liferay的內部功能獲得IP:
String ip = com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest).getRemoteAddr();
有任何門戶中立的方式做到這一點?
嗯,單程...如果在您的Portlet中使用Spring MVC,您將可以訪問相同的servlet請求並獲得客戶端IP。我沒有方便的代碼,但是如果您使用ActionRequest或HTTPservlet請求來向您的控制器類添加代碼。這應該以非Liferay方式爲您提供。
對不起,我不打算在這裏回答你的問題,但添加一些你可能不想獲得IP地址的原因。對於某些設置而言,通常來自一個客戶端的請求來自多個IP地址:它們可能位於負載均衡器之後,捆綁具有不同外部IP地址的某些連接,或者可能隱藏在代理服務器場之後,每個代理服務器用不同的地址。
此外,使用代理或涉及NAT,您可能會從同一個IP地址獲得多個客戶端。
因此:如果您使用客戶端地址進行身份驗證,請格外小心:您可能需要一個客戶端有多個地址,或者一個地址需要多個客戶端。另外,您可以擁有多個來自(相同)多個地址的客戶端。我見過很多關於客戶端地址的危險假設。
保重!
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);
您是否發現了任何JSR-ish方法? – 2010-08-16 18:22:56
@Alexandru:不,我認爲沒有辦法做到這一點「JSR168符合」 – 2010-08-17 04:57:49