全局捕获异常

全局捕获异常:整个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);
         
     }
     
     
}

 

posted @ 2019-01-15 22:59  言西早石头侠  阅读(579)  评论(0编辑  收藏  举报