zoukankan      html  css  js  c++  java
  • 基于AOP做一个拦截并能够返回错误信息到前端的示例程序

    最近基于AOP做了一个拦截并能够返回错误信息到前端的示例程序,目标
    1.通过自定义注解所带参数,进入切面判断是否合法
    2.合法的继续访问
    3.不合法的通过自定义异常向前端返回错误信息

    我能想到的有三个思路
    1.filter实现
    2.基于HttpServletResponse,也可以重定向
    3.自定义异常+@ControllerAdvice
    第一种方法,类似SpringSecurity,我没那么做。
    第二种方法,无法在切面里获取HttpServletResponse对象,或是HttpServletResponse为null,所以我放弃了,我尝试了如下方法

    ServletWebRequest servletContainer = (ServletWebRequest)RequestContextHolder.getRequestAttributes();
    HttpServletResponse response = servletContainer.getResponse();
    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    ServletWebRequest servletWebRequest=new ServletWebRequest(request);
    HttpServletResponse response=servletWebRequest.getResponse();

    都不行

    第三种方法,调通了,自己还无法评估优劣

    源代码地址如下:https://github.com/flyingJiang/InterceptorDemo

    接下来我挑主要的说,顺便各位帮忙看看这样做是否有缺陷

    首先,是切面。我希望实现,满足条件就禁止用户进入api,如果不满足就继续。这个@Around注解,用Before能实现吗?我没能实现,是不是我太纠结return?

    package com.flying.aspect;
    
    
    import com.flying.annotation.Auth;
    import com.flying.exception.MyException;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class AuthInterceptor {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(AuthInterceptor.class);
    
        private static final String NO_AUTH = "没有权限哦!这是一个切面!";
    
        @Autowired
        ControllerExceptionHandler controllerExceptionHandler;
    
        @Around("execution(public * com.flying.controller.*.*(..)) && @annotation(auth)")
        public Object checkAuth(ProceedingJoinPoint pjp, Auth auth) throws  Throwable{
            MethodSignature signature = (MethodSignature) pjp.getSignature();
            String authString = auth.value();
            LOGGER.info("checkAuth,method: {}, clientCode={}", signature.getMethod().getName(), authString);
            // Assume that only yes and no permissions are required for authentication
            if (authString.equals("yes")){
                LOGGER.warn("checkAuth,{}", NO_AUTH);
                return controllerExceptionHandler.handleNoAuthException(new MyException(NO_AUTH));
            }else{
                return pjp.proceed();
            }
        }
    
    }

    再者就是我引入切面异常,这样做是不是不好,还有什么号方法吗?

    package com.flying.aspect;
    
    import com.flying.constant.HttpCodeEnum;
    import com.flying.entity.Result;
    import com.flying.exception.MyException;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class ControllerExceptionHandler {
        private static final Logger LOGGER = LoggerFactory.getLogger(ControllerExceptionHandler.class);
    
        @ExceptionHandler({ MyException.class })
        @ResponseBody
        public Result handleNoAuthException(MyException e) {
            LOGGER.error("handle handleNoAuthException, ex={}", e.getMessage(), e);
            Result result = Result.build(HttpCodeEnum.CODE_401.getValue(),e.getMessage());
            return result;
        }
    }

     结果截图

     

     

    这是bug吗,这个怎么删除?

  • 相关阅读:
    Bottle python
    mongodb python pymongo
    Directory常用
    File类常用
    Path类的常用方法
    winfrom的单例模式
    325工厂模式和面向对象知识点总结(有点乱凑合看)
    音乐播放器自动播放下一首歌记录
    c#分页类(转)
    c# 简历生成器
  • 原文地址:https://www.cnblogs.com/jianfeijiang/p/12177219.html
Copyright © 2011-2022 走看看