(第一张图)近期在生产环境遇到这个问题:For input string: “197,61” 如下图数字转换异常,意思就是原本传入的值应该是数值,但是现在变成了 “197,61” 导致数值转换失败,通过日志可以知道在 IpUtil 类的 getIp2long() 方法的第110行出现了问题,(看第二张图)既然这样就直接找到对应的地方;该代码的功能是将获取的ip转换成Long类型的数值返回,下面的main方法是还原异常写的测试,如果ip是这种(127.0.197,61)那就会出现:For input string: “197,61”,那这样问题就清楚了,问题出在ip上,(看第三张图)最开始ip获取代码,最后在度娘上找到了答案,(有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP)该描述和我遇到的问题相似替换代码后问题解决,具体代码在最后面
/**
* 获取用户真实的ip地址
* @param request
* @return
*/
public static String getIpAdrress(HttpServletRequest request) {
String ip = null;
//X-Forwarded-For:Squid 服务代理
String ipAddresses = request.getHeader("X-Forwarded-For");
String unknown = "unknown";
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//Proxy-Client-IP:apache 服务代理
ipAddresses = request.getHeader("Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//WL-Proxy-Client-IP:weblogic 服务代理
ipAddresses = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//HTTP_CLIENT_IP:有些代理服务器
ipAddresses = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//X-Real-IP:nginx服务代理
ipAddresses = request.getHeader("X-Real-IP");
}
//有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
if (ipAddresses != null && ipAddresses.length() != 0) {
ip = ipAddresses.split(",")[0];
}
//还是不能获取到,最后再通过request.getRemoteAddr();获取
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
ip = request.getRemoteAddr();
}
return ip;
}