鍍金池/ 問答/Java  Linux/ controller層獲取aop方法返回的值

controller層獲取aop方法返回的值

問題描述:
做的內(nèi)容大致是阻止用戶惡意不斷請(qǐng)求,限制單位時(shí)間內(nèi)訪問次數(shù)
然后做了一個(gè)aop,但是我沒法在controller層中獲取aop方法的返回值,如下代碼:

 @Pointcut("execution(public * com.mzd.redis_springboot_mybatis_mysql.controller.*.*(..))")
    public void WebPointCut() {
    }

    @Before("WebPointCut() && @annotation(times)")
    public boolean ifovertimes(final JoinPoint joinPoint, RequestTimes times)  {
        try {
            Object[] objects = joinPoint.getArgs();
            HttpServletRequest request = null;
            for (int i = 0; i < objects.length; i++) {
                if (objects[i] instanceof HttpServletRequest) {
                    request = (HttpServletRequest) objects[i];
                    break;
                }
            }
            if (request == null) {
                return true;
            }
            String ip = request.getRemoteAddr();
            String url = request.getRequestURL().toString();
            String key = "ifovertimes".concat(url).concat(ip);
            long count = redisTemplate.opsForValue().increment(key, 1);
            //如果是第一次,則設(shè)置過期時(shí)間
            if (count == 1) {
                redisTemplate.expire(key, times.time(), TimeUnit.MILLISECONDS);
            }
            if (count <= times.count()) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

然后我要controller層中怎么獲取這個(gè)boolean值,到底是到訪問次數(shù)上限了還是未到訪問次數(shù)上限

回答
編輯回答
瘋浪

Here is the code~

@Around("...")
public Object controllerLogAround(ProceedingJoinPoint pjp) throws Throwable {
    ...
    // 方法形參
    Object[] methodArgs = pjp.getArgs();
    // 調(diào)用并得到返回值
    Object returnValue = pjp.proceed(methodArgs);
    ...
    return returnValue;
}
2017年12月16日 14:45
編輯回答
野橘

了解一下有沒有什么API可以獲取,如果沒有,把boolean值放到request域?qū)ο笾校贑ontroller方法里面是可以取到的。

2017年4月24日 00:13
編輯回答
瘋子范

你看看你的spring-mvc.xml配置文件中有沒有配置aop掃描。
具體可以看看Spring MVC中AOP無效、不起作用,解決方案之一

2017年7月22日 08:02
編輯回答
避風(fēng)港

這個(gè)場(chǎng)景應(yīng)該使用@Around環(huán)繞注入,當(dāng)判斷超過限制次數(shù)時(shí)直接返回異常信息,不再執(zhí)行Controller方法;
另外Controller依賴aop的返回值也是可以做到,但不是良好的程序設(shè)計(jì),這樣違背了AOP的初衷

2017年1月30日 04:57
編輯回答
喵小咪

除了對(duì) 控制器 上面來配置AOP, 還通過 過濾器 / 攔截器 來管理:

2017年11月4日 15:08