全局捕获异常:整个web请求项目全局捕获异常
应用场景:使用Aop技术,采用异常通知
/** * *@author<a href="mailto:lei.tan@vtradex.net">谭磊</a> *@since2019-01-15 22:37 *全局捕获异常案例 *1,捕获返回json格式 *2,捕获返回页面 */ @ControllerAdvice(basePackages="com.example.comtroller") public class GlobalExceptionHandler { @ResponseBody//返回json格式 //modelAndView 返回页面 @ExceptionHandler(RuntimeException.class)//拦截运行时异常 public Map<String, Object> errorJson(){
//实际开发中,怎么将错误记录在日志中 Map<String, Object> map=new HashMap<String, Object>(); map.put("errorcode", "500"); map.put("errormessage", "系统错误"); return map; } }
@ExceptionHandler表示拦截异常
@ControllerAdivce是controller的一个辅助类,最常用的就是作为全局异常处理
@ControllerAdivce 可以指定扫描范围
@ControllerAdivce 约定了几种可行的返回值,如果是直接返回model类的话,需要
@ResponseBody进行json转换
返回String,表示跳转到某个view
返回modelAndView
返回model + @ResponseBody
Log4j日志管理
1.)
1. 新建log4配置文件(resources)
2.导入jar包
3.
@Controller public class JspController { private static final Logger logger =LoggerFactory.getLogger(JspController.class); @RequestMapping("/jspindex") public String index() { logger.info("404 集成log4j日志错误"); return "index"; } }
2)Maven依赖
使用Aop统一处理Web请求日志
<!-- Springboot 整合AOP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
package com.example.aop; import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.example.comtroller.JspController; /** * *@author<a href="mailto:lei.tan@vtradex.net">谭磊</a> *@since2019-01-22 21:24 */ @Aspect @Component public class WebLogAspect { private static final Logger logger =LoggerFactory.getLogger(JspController.class); @Pointcut("execution(public * com.example.controller.*.*(..))") public void weblog() { } /** * 使用Aop的前置通知 *tanlei *2019年1月22日 * */ @Before("weblog()") public void deBefore(JoinPoint joinPoint) throws Throwable{ //接收到请求,记录请求内容 ServletRequestAttributes attributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request=attributes.getRequest(); //记录下请求内容 logger.info("URL:"+request.getRequestURI().toString()); logger.info("HTTP_METHOD:"+request.getMethod()); logger.info("IP:"+request.getRemoteAddr()); Enumeration<String> enu=request.getParameterNames(); while(enu.hasMoreElements()) { String name =(String)enu.nextElement(); logger.info("name:{},value:{}",name,request.getParameter(name)); } } //传统写在磁盘上有很大缺点,分布式情况 服务器集群呢?20台服务器,分布式日志收集 /** * 后置通知 *tanlei *2019年1月22日 * */ @AfterReturning(returning="ret",pointcut="weblog()") public void doAfterReturning(Object ret)throws Throwable { //处理完请求,返回内容 logger.info("Response:"+ret); } }