由于项目需要做用户体验的数据查询分析,从而分析用户的查询喜好和查询方式来改善系统的体验。上网也查找了很多方式来获取这个IP地址问题。很多朋友也许会经常遇到这个方法。
public String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("x-forwarded-for");
if ((ip == null) || (ip.length() == 0)
|| ("unknown".equalsIgnoreCase(ip)))
ip = request.getHeader("Proxy-Client-IP");
if ((ip == null) || (ip.length() == 0)
|| ("unknown".equalsIgnoreCase(ip)))
ip = request.getHeader("WL-Proxy-Client-IP");
if ((ip == null) || (ip.length() == 0)
|| ("unknown".equalsIgnoreCase(ip)))
ip = request.getRemoteAddr();
return ip;
}
但是结果都为:
要解决这个问题其实也很简单,这个错误,可能是本机的host设置有问题,我记得好像IE浏览器有一个安全设置,但是在局域网内的另一台电脑登入WEB端测试能显示出IP地址但是只是局域网的地址,并没有什么卵用。
想要获取IP地址的办法,参考了下流的办法,通过访问能获取IP地址的网站,读取网址信息并转换成流,用字符流(StringBuffer)截取IP的信息。
public static String getNetIP() throws IOException{
InputStream ins = null;
try {
URL url = new URL("http://city.ip138.com/ip2city.asp"); //获取IP地址的网站
URLConnection con = url.openConnection(); //打开网址的链接
ins = con.getInputStream();
InputStreamReader isReader = new InputStreamReader(ins, "GB2312");
BufferedReader bReader = new BufferedReader(isReader);
StringBuffer webContent = new StringBuffer();
String str = null;
while ((str = bReader.readLine()) != null) {
webContent.append(str);
}
int start = webContent.indexOf("[") + 1;
int end = webContent.indexOf("]");
return webContent.substring(start, end);
} finally {
if (ins != null) {
ins.close();
}
}
}
另一个:通过JDK本来就有的方法,是可以获取到局域网内的IP地址,
public static String get<span style="font-family: Arial, Helvetica, sans-serif;">Local</span>IP() throws IOException {
InetAddress ia = InetAddress.getLocalHost();
return ia.getHostAddress();
}
执行的结果如下:
补充:遇项目里有多重反向代理
最后写的一个操作遇负载均衡时候需要处理下返回的值。