You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 line
3.9 KiB

  1. package com.iformall.common;
  2. import com.iformall.exception.MallinkException;
  3. import com.iformall.service.MailService;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.web.bind.annotation.ControllerAdvice;
  8. import org.springframework.web.bind.annotation.ExceptionHandler;
  9. import org.springframework.web.bind.annotation.ResponseBody;
  10. import javax.servlet.http.HttpServletRequest;
  11. import java.io.PrintWriter;
  12. import java.io.StringWriter;
  13. import java.text.SimpleDateFormat;
  14. import java.util.Date;
  15. import java.util.Enumeration;
  16. @ControllerAdvice
  17. public class GlobalDefultExceptionHandler {
  18. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  19. @Autowired
  20. private boolean isFmException;
  21. @Autowired
  22. private String fmExceptionEmails;
  23. @Autowired
  24. private MailService mailService;
  25. @ExceptionHandler(Exception.class)
  26. @ResponseBody
  27. public ResultData defultExcepitonHandler(HttpServletRequest request, Exception e) {
  28. log(e, request);
  29. if(isFmException) {
  30. // 处理异常,发送邮件
  31. if(checkExceptionType(e)) {
  32. // 某些异常不发邮件
  33. MallinkException me = (MallinkException)e;
  34. return new ResultData(me.getErrorCode(),me.getMessage());
  35. }
  36. StringWriter sw = new StringWriter();
  37. PrintWriter pw = new PrintWriter(sw);
  38. e.printStackTrace(pw);
  39. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
  40. StringBuilder sb = new StringBuilder();
  41. sb.append(df.format(new Date()));
  42. sb.append("\n");
  43. sb.append(sw.toString());
  44. String[] receivers = fmExceptionEmails.split(",");
  45. //发送邮件
  46. mailService.sendSimpleMail(receivers, "请求地址:" + request.getRequestURL() + "异常", sb.toString());
  47. }
  48. if(checkExceptionType(e)) {
  49. MallinkException me = (MallinkException)e;
  50. return new ResultData(me.getErrorCode(),me.getMessage());
  51. }else {
  52. return new ResultData(Result.ERROR, e.getMessage());
  53. }
  54. }
  55. private void log(Exception ex, HttpServletRequest request) {
  56. logger.error("************************异常开始*******************************");
  57. if(checkExceptionType(ex)) {
  58. // 特殊异常不打印堆栈
  59. logger.error(ex.getMessage());
  60. logger.error("************************异常结束*******************************");
  61. return;
  62. }
  63. logger.error("请求地址:" + request.getRequestURL());
  64. logger.error("message:"+ ex.getMessage());
  65. Enumeration enumeration = request.getParameterNames();
  66. logger.error("请求参数");
  67. while (enumeration.hasMoreElements()) {
  68. String name = enumeration.nextElement().toString();
  69. logger.error(name + "---" + request.getParameter(name));
  70. }
  71. StackTraceElement[] error = ex.getStackTrace();
  72. for (StackTraceElement stackTraceElement : error) {
  73. logger.error(stackTraceElement.toString());
  74. }
  75. logger.error("************************异常结束*******************************");
  76. }
  77. private boolean checkExceptionType(Exception e) {
  78. if(e instanceof MallinkException) {
  79. MallinkException me = (MallinkException)e;
  80. if(me.getErrorCode() == ErrorCode.NET_TOKEN_EMPTY.getCode()
  81. || me.getErrorCode() == ErrorCode.NET_TOKEN_INVALID.getCode()) {
  82. // token异常问题, 不发邮件
  83. return true;
  84. } else if(me.getErrorCode() == ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION.getCode()) {
  85. // 重复访问不打印异常消息
  86. return true;
  87. }
  88. }
  89. return false;
  90. }
  91. }