SpringAop應(yīng)用實(shí)例

HTTP 接口鑒權(quán)

需求描述:

  1. 可以定制地為某些指定的 HTTP RESTful api 提供權(quán)限驗(yàn)證功能.
  2. 當(dāng)調(diào)用方的權(quán)限不符時(shí), 返回錯(cuò)誤.

根據(jù)上面所提出的需求, 我們可以進(jìn)行如下設(shè)計(jì):

  1. 提供一個(gè)特殊的注解 AuthChecker, 這個(gè)是一個(gè)方法注解, 有此注解所標(biāo)注的 Controller 需要進(jìn)行調(diào)用方權(quán)限的認(rèn)證.
  2. 利用 Spring AOP, 以 @annotation 切點(diǎn)標(biāo)志符來(lái)匹配有注解 AuthChecker 所標(biāo)注的 joinpoint.
  3. 在 advice 中, 簡(jiǎn)單地檢查調(diào)用者請(qǐng)求中的 Cookie 中是否有我們指定的 token, 如果有, 則認(rèn)為此調(diào)用者權(quán)限合法, 允許調(diào)用, 反之權(quán)限不合法, 范圍錯(cuò)誤.

1.自定義AuthChecker注解

代碼示例

@Target(ElementType.method)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthChecker{
    
}

2.自定義切面類(lèi)

代碼示例

@Aspect
@Componet
public class AopAdvise{
    // 定義一個(gè)切點(diǎn) 那些方法必須要進(jìn)行攔截
    @Pointcut("@annotation(com.zjzcc.xys.demo.AuthChecker)")
    public void pointcut(){
        
    }
    
    // 定義一個(gè)Advise
    @Around("pointcut()")
    public Object checkAuth(ProceedingJoinPoint joint){
        // TODO 業(yè)務(wù)邏輯自己實(shí)現(xiàn)
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
            .getRequest();
        return joint.procees();
    }
    
    
    
}

方法調(diào)用日志

首先假設(shè)我們有如下需求:

  • 某個(gè)服務(wù)下的方法的調(diào)用需要有 log: 記錄調(diào)用的參數(shù)以及返回結(jié)果.
  • 當(dāng)方法調(diào)用出異常時(shí), 有特殊處理, 例如打印異常 log, 報(bào)警等.

代碼示例

@Componet
@Aspect
public class LogAspect{

    private Logger logger = LoggerFactory.getLogger(getClass());
    
    @Pointcut("within(NeedLogService)")
    public void pointcut(){
        
    }
    
    @Before("pointcut()")
    public void logMethodInvokeParam(JoinPoint joinPoint){
        logger.info("方法名:{},參數(shù)名:{}",joinpoint.getSignature().toString,joinpoint.getArgs());
    }
    
    @AfterReturning(pointcut = "pointcut()",returning = "retVal")
    public void logMethodResultInvoke(JoinPoint joinpoint,Object retVal){
            logger.info("方法名:{},參數(shù)名:{}",joinpoint.getSignature().toString,joinpoint.getArgs());
    }    
    
    @AfterThrowing(pointcut = "pointcut",throwing = "exception")
    public void logMethodException(JointPoint joint,Exception ex){
        logger.info("方法名:{},異常信息:{}",joinpoint.getSignature().toString,ex.getMessage());
    }
}

方法統(tǒng)計(jì)耗時(shí)

代碼示例

@Component
@Aspect
@Order(1)
public class ExpireAspect {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Pointcut("within(com.leyou.user.service.UserService)")
    public void pointcut(){

    }

    @Around("pointcut()")
    public Object methodInvokeParam(ProceedingJoinPoint joinPoint) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        // 開(kāi)始執(zhí)行切入點(diǎn)里面的方法
        Object proceed = joinPoint.proceed();
        stopWatch.stop();
        logger.info("統(tǒng)計(jì)耗時(shí):{}",stopWatch.prettyPrint());
        return proceed;
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 16,208評(píng)論 2 11
  • Java 注解 學(xué)習(xí)筆記 前言: 注解是一個(gè)很早就出現(xiàn)的技術(shù),之前一直沒(méi)有時(shí)間就這么拖著,現(xiàn)在閑暇之時(shí)學(xué)習(xí)一下,...
    真的有照片閱讀 1,160評(píng)論 0 1
  • 一天,同學(xué)們?nèi)ソ纪饨o小鳥(niǎo)做個(gè)新家,小鳥(niǎo)們很開(kāi)心,小鳥(niǎo)說(shuō),謝謝你,還有的同學(xué)拿著房子,繼續(xù)給其他小鳥(niǎo)安裝房子,同學(xué)們...
    17李登博閱讀 332評(píng)論 0 0
  • 小烏龜死了。 四肢僵硬,一動(dòng)不動(dòng),我一度覺(jué)得不可思議,不都說(shuō)烏龜?shù)膲勖荛L(zhǎng)嗎!可是我只是離開(kāi)家四天,再回來(lái)就這樣猝...
    想爾小記閱讀 279評(píng)論 2 4
  • 產(chǎn)品文案三要素:產(chǎn)品,品牌,消費(fèi)者。 好的產(chǎn)品文案,就是這三者的結(jié)合。 產(chǎn)品——核心是利益點(diǎn)。就是產(chǎn)品的特點(diǎn),以及...
    于秩猛閱讀 295評(píng)論 0 0

友情鏈接更多精彩內(nèi)容