標籤:end conf slf4j false author str logger signature 調用
商務邏輯:寫一個公用攔截類,過濾傳進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@Componentpublic 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切面控制商務邏輯