java aop性能检测_SpringAOP01 利用AOP实现权限验证、利用权限验证服务实现权限验证...

1 编程范式

1.1 面向过程

1.2 面向对象

1.3 面向切面编程

1.4 函数式编程

1.5 事件驱动编程

2 什么是面向切面编程

2.1 是一种编程范式,而不是一种编程语言

2.2 解决一些特定的问题

2.3 作为面向对象编程的一种补充

3  AOP产生的初衷

3.1 解决代码重复性问题 Don't Repeat Yourself

3.2 解决关注点分离问题 Separation of Concerns

3.2.1 水平分离(技术上划分)

控制层 -> 服务层 -> 持久层

3.2.2 垂直分离(模块上划分)

模块划分

3.2.3 切面分离(功能上划分)

分离功能性需求和非功能性需求

4 使用AOP的好处

4.1 集中处理某一个关注点、横切逻辑

4.2 可以很方便地添加、删除关注点

4.3 侵入性减少,增强代码可读性和可维护性

5 AOP的使用场景

5.1 权限控制

5.2 缓存控制

5.3 事物控制

5.4 审计日志

5.5 性能监控

5.6 分布式追踪

5.7 异常处理

6 利用传统方法实现权限验证

6.1 创建一个springBoot项目

下载地址:点击前往

6.2 新建一个Product实体类

8e5e442c297487c26cc826d13f094e7f.gif 

Product.java

6.3 新建一个权限模拟类

该类主要用来设定用户和获取用户

4c4880c84cf3efb1ed208fed1b58c846.gif

65b91a2e5e4132ecb02106c177b8bcb3.gif

package cn.test.demo.base_demo.security;

/**

* @author 王杨帅

* @create 2018-04-29 17:15

* @desc 模拟用户登录,该类可以设定用户和获取用户

**/

public class CurrentSetHolder {

private final static ThreadLocal holder = new ThreadLocal<>();

/**

* 获取用户

* @return

*/

public static String get() {

return holder.get() == null ? "unknown" : holder.get();

}

/**

* 设定用户

* @param user

*/

public static void set(String user) {

holder.set(user);

}

}

bd004e214f8ab08baf528c51ed2327dc.gif

6.4 新建一个权限校验类

该类主要用于判断当前用户是否是“admin”用户

0f5386f270dc6304d069937909eaa670.gif

c7ba7e32f5118022defb36c551744646.gif

package cn.test.demo.base_demo.service;

import cn.test.demo.base_demo.security.CurrentSetHolder;

import org.springframework.stereotype.Component;

/**

* @author 王杨帅

* @create 2018-04-29 17:19

* @desc 权限校验服务类

**/

@Component

public class AuthService {

/**

* 权限检查,如果用户不是 “admin" 就会报错

*/

public void checkAccess() {

String user = CurrentSetHolder.get();

if (!"admin".equals(user)) {

throw new RuntimeException("operation not allow.");

}

}

}

4aa45e39e3e1e9f8f64c2b784dd60c33.gif

6.5 新建ProductService类

该类主要实现对Product的一些操作

8f900a89c6347c561fdf2122f13be562.png 

ProductService.java

6.6 创建一个服务层测试类

在调用ProductService的insert方法前对用户进行设定

20db286fe561ad828dd663418d44e422.gif 

ProductServiceTest.java

7 利用AOP实现权限验证

7.1 新建一个springBoot项目

下载地址:点击前往

7.2 创建一个Product实体类

122e92be638ecea7e91fcb11a816964f.gif

1e9763b3b5fc8718c8fb8f8b11e4baf2.gif

package cn.test.demo.base_demo.entity;

/**

* @author 王杨帅

* @create 2018-04-29 17:11

* @desc 商品实体类

**/

public class Product {

private Integer id;

private String name;

public Product() {

}

public Product(Integer id, String name) {

this.id = id;

this.name = name;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Product{" +

"id=" + id +

", name='" + name + '\'' +

'}';

}

}

31e13ac8b429cb9a13b3599b994a70ce.gif

7.3 创建一个AdminOnly注解

dcbc4ec5c2f9acade9006e06d1d75167.gif

de24c82b5b042d231b7096d9bb753313.gif

package cn.test.demo.base_demo.security;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface AdminOnly {

}

bb9d2b67d912beb9e70510723ef4c94b.gif

7.4 新建一个权限模拟类

该类主要用来设置用户和获取用户

961ddebeb323a10fe0623af514929fc1.png

3483e0721edb3b2d970ff10dae908428.gif

package cn.test.demo.base_demo.security;

/**

* @author 王杨帅

* @create 2018-04-29 17:15

* @desc 模拟用户登录,该类可以设定用户和获取用户

**/

public class CurrentSetHolder {

private final static ThreadLocal holder = new ThreadLocal<>();

/**

* 获取用户

* @return

*/

public static String get() {

return holder.get() == null ? "unknown" : holder.get();

}

/**

* 设定用户

* @param user

*/

public static void set(String user) {

holder.set(user);

}

}

12c08556c5e95d69e6485493e9c296c1.gif

7.5 创建一个切面类

该类主要对所有使用了@AdminOnly注解的方法进行权限校验

a49bb54a9c1be6113a35aca5b1ac226b.gif

2271659d46de3e99a86261cfc7cb2575.gif

package cn.test.demo.base_demo.security;

import cn.test.demo.base_demo.service.AuthService;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

/**

* @author 王杨帅

* @create 2018-04-29 17:37

* @desc 权限检查的AOP类

**/

@Aspect

@Component

public class SecurityAspect {

@Autowired

AuthService authService;

@Pointcut("@annotation(AdminOnly)")

public void adminOnly(){

}

@Before("adminOnly()")

public void check(){

authService.checkAccess();

}

}

ded73817a7744ded33c66c93730ca309.gif

7.6 新建一个ProductService服务类

该类的delete方法用了@AdminOnly注解,所以delete方法会进行权限校验

816e9803d5e71c8c12462decda74d218.gif 

ProductService.java

7.7 创建一个测试类

productService.delete(id) 方法中有权限验证,如果不是“admin"用户就会报错【利用AOP实现的】

35ccf66398e4232ba4b5b84f8297f154.gif 

ProductServiceTest.java

7.8 源代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值