博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot AOP拦截
阅读量:5883 次
发布时间:2019-06-19

本文共 2502 字,大约阅读时间需要 8 分钟。

hot3.png

拦截指定的Controller里面的方法

可以在指定拦截的Controller中方法执行之前,进行请求拦截,比如对一些需要授权验证的方法进行拦截判断cookie及权限。

@Component

@Pointcut("execution(public * com.xxx.controller.*.*(..))" +            "&& !execution(public * com.xxx.controller.WelcomeController.*(..))")    public void verify() {    }    @Before("verify()")    public void doVerify(JoinPoint joinPoint) {        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();        HttpServletRequest request = attributes.getRequest();        // 用户身份认证        UserVO user = UserAuth.getUserInfoFromToken(request, redisClient, authService);        // 同步用户信息到 threadlocal        ThreadLocalUtil.set(CommonConstant.USERID, user.getId());        ThreadLocalUtil.set(CommonConstant.USERNAME, user.getName());        // 用户鉴权        RequestPermissions permissions = UserPermission.getAnnotation(joinPoint);        if (null != permissions) {            UserPermission.checkUserPermissionAllow(request, authService, user, permissions);        }    }

拦截所有打上指定注解的方法

比如在程序中控制读写分离,可以定义一个@Slave注解,在执行指定service的方法之前判断是否存在@Slave注解。

@Before("@annotation(test)")// 拦截被TestAnnotation注解的方法;如果你需要拦截指定package指定规则名称的方法,可以使用表达式execution(...),具体百度一下资料一大堆 public void beforeTest(JoinPoint point, TestAnnotation test) throws Throwable {  System.out.println("beforeTest:" + test.name()); }  @After("@annotation(test)") public void afterTest(JoinPoint point, TestAnnotation test) {  System.out.println("afterTest:" + test.name()); }    @Around("@annotation(slave)")    public Object proceed(ProceedingJoinPoint proceedingJoinPoint, Slave slave) throws Throwable {        try {            logger.info("set database connection to slave");            DatabaseContextHolder.setDatabaseType(DatabaseType.SLAVE);            return proceedingJoinPoint.proceed();        } finally {            DatabaseContextHolder.clearDbType();            logger.info("restore database connection");        }    }

拦截dao数据库操作方法,做读写分离

@Aspect@Componentpublic class DataSourceAspect {     @Before("execution(* com.xxx.firstboot.dao.*.*(..))")    public void setDataSourceKey(JoinPoint point){         //连接点所属的类实例是ShopDao         if(point.getTarget() instanceof ShopDao){             DatabaseContextHolder.setDatabaseType(DatabaseType.mytestdb2);         }else{//连接点所属的类实例是UserDao(当然,这一步也可以不写,因为defaultTargertDataSource就是该类所用的mytestdb)             DatabaseContextHolder.setDatabaseType(DatabaseType.mytestdb);         }     }}

转载于:https://my.oschina.net/u/1000241/blog/1591570

你可能感兴趣的文章
GDB调试之暂停
查看>>
c语言全局变量和局部变量问题汇总
查看>>
scott权限
查看>>
Shell数值、字符串比较
查看>>
远程调用相关技术
查看>>
和Timesten有个约会--Timesten技术专栏系列(一)
查看>>
Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码
查看>>
系统架构设计师考试大纲
查看>>
XMPP协议介绍
查看>>
学习 TList 类的实现[2]
查看>>
BIND_MISMATCH导致过多VERSION COUNT的问题
查看>>
五个你必须知道的javascript和web debug技术
查看>>
Uva----------(11078)Open Credit System
查看>>
为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
查看>>
.net Framework各个版本之间的发展
查看>>
什么是Activity
查看>>
格式化输入输出
查看>>
[Hibernate] - Criteria Select
查看>>
Perl的debug小技巧
查看>>
2015第33周三
查看>>