Liferay 如何在JSR168 Portlet中获取客户端IP?

Liferay 如何在JSR168 Portlet中获取客户端IP?,liferay,Liferay,如何在JSR168 Portlet中获取客户机(请求)的IP 我在Liferay 5.2.3上 我可以使用Liferay内部功能获取IP: String ip=com.liferay.portal.util.PortalUtil.getHttpServletRequest(renderRequest.getRemoteAddr(); 有没有任何与门户无关的方法可以做到这一点?好吧,有一种方法……如果在Portlet中使用Spring MVC,您将可以访问相同的servlet请求并获得客户端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)//使可见
HttpServletRequest HttpServletRequest=(HttpServletRequest)f.get(请求);获取请求
字符串ip=httpServletRequest.getHeader(“x-forwarded-for”);
if(ip==null | | ip.length()==0 | |“未知”。equalsIgnoreCase(ip)){
ip=httpServletRequest.getHeader(“代理客户端ip”);
}
if(ip==null | | ip.length()==0 | |“未知”。equalsIgnoreCase(ip)){
ip=httpServletRequest.getHeader(“WL代理客户端ip”);
}
if(ip==null | | ip.length()==0 | |“未知”。equalsIgnoreCase(ip)){
ip=httpServletRequest.getRemoteAddr();
}
System.out.println(“ip:=”+ip);

你找到JSR-ish的方法了吗?@Alexandru:没有,我认为没有任何方法可以做到“JSR168-conform”