SpringBoot切面控制业务逻辑
业务逻辑:写一个公共拦截类,过滤传进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..*.*(..))
作者:Rest探路者
出处:http://www.cnblogs.com/Java-Starter/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意请保留此段声明,请在文章页面明显位置给出原文连接
Github:https://github.com/cjy513203427
分类:
SpringBoot
标签:
Spring AOP
, Springboot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?