一共兩個文件,一個處理全局異常,保存信息到日誌,另一個負責返回異常信息給接口,只要將其文件添加到項目中,無需再作其餘配置便可java
優先執行此類,這裏很差抓取40四、403等錯誤信息
getMaps()請參考獲取request中傳遞過來的參數信息
getHeaders()請參考獲取request中傳遞過來的header信息
代碼以下:web
import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; /** * <h5>描述:全局異常處理類</h5> * 優先執行此異常處理類 * */ @ControllerAdvice public class MyExceptionHandler { private final Logger log = LoggerFactory.getLogger(getClass()); @ExceptionHandler(value =Exception.class) public String exceptionHandler(HttpServletRequest request, Exception e){ Map<String, Object> paramsMap = getMaps(request); Map<String, Object> headersMap = getHeaders(request); String requestUri = request.getAttribute("org.springframework.web.servlet.HandlerMapping.lookupPath").toString(); log.error("請求[{}]發生[{}]異常\r\n參數[{}]\r\nheader[{}]", requestUri,e.getMessage(),paramsMap,headersMap, e); // 返回錯誤信息,交給其餘異常處理類處理 return e.getMessage(); } // =================== private method =================== /** * <h5>功能:獲取從request中傳遞過來的參數信息</h5> * * @return Map<String, Object> */ private Map<String, Object> getMaps(HttpServletRequest request){ Map<String, Object> paramMap = new HashMap<String, Object>(); Enumeration<String> enume = request.getParameterNames(); while (enume.hasMoreElements()) { String key = (String) enume.nextElement(); String[] values = request.getParameterValues(key); paramMap.put(key, values.length == 1 ? request.getParameter(key).trim() : values); } return paramMap; } /** * <h5>功能: 獲取從request中傳遞過來的header信息</h5> * * @return Map<String, Object> */ private Map<String, Object> getHeaders(HttpServletRequest request) { Map<String, Object> headerMap = new HashMap<String, Object>(); Enumeration<?> er = request.getHeaderNames();//獲取請求頭的全部name值 String headerName; while(er.hasMoreElements()){ headerName = er.nextElement().toString(); headerMap.put(headerName, request.getHeader(headerName)); } return headerMap; } }
後執行此類,此類能夠有效抓取,40四、403等信息,代碼以下:spring
import javax.servlet.http.HttpServletRequest; import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.jnxj.common.vo.MessageBean; /** * <h5>描述:全局錯誤信息處理</h5> * 執行完異常處理類以後執行此類 */ @RestController public class MyErrorController implements ErrorController { @Override public String getErrorPath() { return "/error"; } @RequestMapping("/error") public String handleError(HttpServletRequest request) { String message; // 獲取statusCode:401,404,500 Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); if (statusCode == 400) { message = "語義有誤,當前請求沒法被服務器理解或請求參數有誤"; } else if (statusCode == 401) { message = "當前請求須要用戶驗證"; } else if (statusCode == 403) { message = "權限不足"; } else if (statusCode == 404) { message = "請求的資源不存在"; } else { message = "系統不當心生病了,正在緊急修復中,請耐心等候...o(╥﹏╥)o"; } MessageBean messageBean = new MessageBean(); messageBean.setCode(statusCode.toString()); messageBean.setMessage(message); return JSONObject.toJSONString(messageBean); } }