package com.java110.api.aop; import com.java110.core.log.LoggerFactory; import com.java110.vo.ResultVo; import org.slf4j.Logger; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; @RestControllerAdvice public class GlobalExceptionHandler { private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); @ExceptionHandler(Throwable.class) public ResponseEntity handleException(Throwable e) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes != null) { HttpServletRequest request = attributes.getRequest(); String url = request.getRequestURL() != null ? request.getRequestURL().toString() : ""; String method = request.getMethod(); String ip = getIpAddr(request); Map headers = new HashMap<>(); Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { String name = headerNames.nextElement(); headers.put(name, request.getHeader(name)); } logger.error("===== 全局异常捕获 ====="); logger.error("请求URL: {} [{}]", url, method); logger.error("请求IP: {}", ip); logger.error("请求头: {}", headers); logger.error("异常类型: {}", e.getClass().getName()); logger.error("异常信息: {}", e.getMessage(), e); logger.error("===== 全局异常结束 ====="); } else { logger.error("全局异常捕获: {}", e.getMessage(), e); } return ResultVo.error("服务器内部错误,请联系管理员", HttpStatus.INTERNAL_SERVER_ERROR); } private 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.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(); } return ip; } }