我想知道是谁造成的异常,Java在捕获异常时获取造成异常人所用电脑的ip
通过用户的请求头来获取用户的真实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();
}
if (!(null == ip || "".equals(ip.trim()) || "null".equalsIgnoreCase(ip.trim())) && ip.contains(",")) {
ip = ip.split(",")[0];
}
return ip;
}
加个HttpServletRequest request参数,然后:
String ip = request.getRemoteAddr();
可以参考下这个http://t.csdn.cn/zBvh8
可以不使用携带HttpSerlvetRequest参数,而是用RequestContextHolder来获取当前线程的request,不然个方法都要传个HttpServletRequest是很难受的,具体使用它的方式如下:
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
然后下面是获取用户真实IP的方法:
/**
* 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
*/
public static String getIpAddress(HttpServletRequest request) {
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
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.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} else if (ip.length() > 15) {
String[] ips = ip.split(",");
for (String s : ips) {
if (!("unknown".equalsIgnoreCase(s))) {
ip = s;
break;
}
}
}
return ip;
}
将上面的方法放到一个工具类里,例如命名为HttpUtils.java中,每次在异常或者全局异常使用时可以像这样:
try{
//正常逻辑代码
} catch(Exception e){
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String requestIpAddress = HttpUtil.getIpAddress(request); //获取请求的IP地址
//相关异常处理
}