Springboot使用拦截器记录

概述

关于在使用Springboot的使用过程中,对于Spring中的aop面向切面编程中的几个主要使用场景做了一些记录

1. Springboot 中配置拦截器

拦截器中用到bean注入时,需要提前加载bean注解(LoginInterceptor为自己编写的登录拦截器)
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LoginInterceptor getLoginInterceptor() {
        return new LoginInterceptor();
    }

    //添加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        super.addCorsMappings(registry);
    }

Springboot中的拦截器实现HandlerInterceptor,重写里面的几个方法:
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        String url = httpServletRequest.getRequestURI();
        //处理一些路径的放行
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

2.异常处理器(全局异常处理)

@ControllerAdvice
public class ExceptionHandler {

    @org.springframework.web.bind.annotation.ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Response handle(Exception e) {
        if (e instanceof BusinessException) {
            return HttpUtil.respondFail(((BusinessException) e).getCode(), e.getMessage());
        } else if (e instanceof NullPointerException) {
            e.printStackTrace();
            return HttpUtil.respondFail(500, "服务器繁忙");
        }
        e.printStackTrace();
        return HttpUtil.respondFail(500, "服务器开小差了");
    }
}

3.使用aop实现统一日志记录打印

@Aspect
@Component
public class HttpAspect {
    private static Logger logger = LoggerFactory.getLogger(HttpAspect.class);

    // 定义切点Pointcut
    @Pointcut("execution(* com.*.controller..*.*(..))")
    public void logHttp() {
    }

    @Around("logHttp()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
        RequestAttributes ra = RequestContextHolder.getRequestAttributes();
        ServletRequestAttributes sra = (ServletRequestAttributes) ra;
        HttpServletRequest request = sra.getRequest();

        String url = request.getRequestURL().toString();
        String method = request.getMethod();
        String uri = request.getRequestURI();
        String queryString = request.getQueryString();
        logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);

        // result的值就是被拦截方法的返回值
        Object result = pjp.proceed();
        Gson gson = new Gson();
        logger.info("请求结束,controller的返回值是 " + gson.toJson(result));
        return result;
    }

}

Created By 2018 - 04 -12

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,464评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,631评论 25 709
  • 上午的时候数学老师在教学群里面发了一行字,“一个大二快进入大三的学生,做作业除了会抄袭答案,什么都不会,说出来都丢...
    droid1277阅读 1,514评论 0 2
  • 孩子,我希望你自始至终都是一个理想主义者。 你可以是农民,可以是工程师,可以是演员,可以是流浪汉,但你必须是个理想...
    大叔是个loli控阅读 3,666评论 0 0
  • 你像只蝴蝶在天上飞 飞来飞去飞不到我身边 我只能远远痴痴望着你 这是男人眼中仰望的美丽花蝴蝶,女人如花似美丽翩...
    溪水音阅读 3,192评论 2 12