1. 程式人生 > >SpringBoot切面控制業務邏輯

SpringBoot切面控制業務邏輯

過濾 joinpoint extends exe ota xtend http lang back

業務邏輯:寫一個公共攔截類,過濾傳進Controller的參數

為了調用接口安全起見,每個需要調用的接口有一個參數accessToken,用於安全驗證

註:先進入過濾器Filter,再進入aop,最後進入Controller,我們做的事在aop過濾Controller參數

package com.xgt.config;


import com.xgt.common.BaseController;
import com.xgt.common.PcsResult;
import com.xgt.util.IpUtil;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; /** * 攔截器:記錄用戶接口操作次數 * @author
cc */ @Aspect @Component public class ControllerInterceptor extends BaseController { private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class); @Value("${spring.profiles.active}") private String env; /** * 定義攔截規則:攔截com.xgt.controller.bs包下面的所有類中 */ @Pointcut("execution(* com.xgt.controller.bs..*.*(..))") public void controllerMethodPointcut(){} /** * 攔截器具體實現 * @param pjp * @return JsonResult(被攔截方法的執行結果,或需要登錄的錯誤提示。) */ @Around("controllerMethodPointcut()") //指定攔截器規則;也可以直接把“execution(* com.xjj.........)”寫進這裏 public PcsResult Interceptor(ProceedingJoinPoint pjp){ Object[] paramValues = pjp.getArgs(); String accessToken = ""; for(int i=0;i<paramValues.length;i++){ if(accessToken!=null) { accessToken = paramValues[0].toString(); } } Object result = null; try { String accessTokenKey="xxxx"; if(!accessToken.equals(accessTokenKey)){ return newResult(false).setMessage("參數錯誤"); } int requestCount=0; if(StringUtils.isNotEmpty(accessTokenKey)){ requestCount++; if(requestCount>100){ return newResult(false).setMessage("請求的太快啦,休息一會再試試"); } } if(result == null){ // 一切正常的情況下,繼續執行被攔截的方法 result = pjp.proceed(); requestCount++; } } catch (Throwable e) { logger.error("exception: ", e); return newResult(false).setMessage(""+e.getMessage()); } return (PcsResult) result; } }

補充:攔截命名規則簡述

1)表示匹配所有方法

execution(* *(..))

2)表示匹配com.savage.server.UserService中所有的公有方法

execution(public * com. savage.service.UserService.*(..))

3)表示匹配com.savage.server包及其子包下的所有方法

execution(* com.savage.server..*.*(..))

SpringBoot切面控制業務邏輯