Spring项目AOP百度网盘密码数据兼容处理

1. 需求分析

需求: 对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理。

在这里插入图片描述

问题描述:

  • 点击链接,会提示,请输入提取码,如下图所示

    在这里插入图片描述

  • 当我们从别人发给我们的内容中复制提取码的时候,有时候会多复制到一些空格,直接粘贴到百度的提取码输入框

  • 但是百度那边记录的提取码是没有空格的

  • 这个时候如果不做处理,直接对比的话,就会引发提取码不一致,导致无法访问百度盘上的内容

  • 所以多输入一个空格可能会导致项目的功能无法正常使用。

  • 此时我们就想能不能将输入的参数先帮用户去掉空格再操作呢?

答案是可以的,我们只需要在业务方法执行之前对所有的输入参数进行格式处理——trim()

  • 是对所有的参数都需要去除空格么?

也没有必要,一般只需要针对字符串处理即可。

  • 以后涉及到需要去除前后空格的业务可能会有很多,这个去空格的代码是每个业务都写么?

可以考虑使用AOP来统一处理。

  • AOP有五种通知类型,该使用哪种呢?

我们的需求是将原始方法的参数处理后在参与原始方法的调用,能做这件事的就只有环绕通知。

综上所述,我们需要考虑两件事:
①:在业务方法执行之前对所有的输入参数进行格式处理——trim()
②:使用处理后的参数调用原始方法——环绕通知中存在对原始方法的调用

2. 环境准备

  • 创建一个Maven项目

  • pom.xml添加Spring依赖

    <dependencies>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.2.10.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.9.4</version>
        </dependency>
      </dependencies>
    
  • 添加ResourcesDao和ResourcesDaoImpl类

    public interface ResourcesDao {
        boolean readResources(String url, String password);
    }
    
    @Repository
    public class ResourcesDaoImpl implements ResourcesDao {
        public boolean readResources(String url, String password) {
            //模拟校验
            return password.equals("1234");
        }
    }
    
  • 添加ResourcesService和ResourcesServiceImpl类

    public interface ResourcesService {
        public boolean openURL(String url ,String password);
    }
    
    @Service
    public class ResourcesServiceImpl implements ResourcesService {
    
        @Autowired
        private ResourcesDao resourcesDao;
    
        public boolean openURL(String url, String password) {
            return resourcesDao.readResources(url,password);
        }
    }
    
  • 创建Spring的配置类

    @Configuration
    @ComponentScan("com.dcxuexi")
    public class SpringConfig {
    }
    
  • 编写SpringAop运行类

    public class SpringAop {
        public static void main(String[] args) {
            ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
            ResourcesService resourcesService = context.getBean(ResourcesService.class);
            boolean b = resourcesService.openURL("https://pan.baidu.com/s/1AA14syG9sE4VAdTJMvgzzw", "1234 ");
            System.out.println(b);
        }
    }
    

最终创建好的项目结构如下:

在这里插入图片描述

现在项目的效果是,当输入密码为"1234"控制台打印为true,如果密码改为"1234 "控制台打印的是false

需求是使用AOP将参数进行统一处理,不管输入的密码1234前后包含多少个空格,最终控制台打印的都是true。

3. 具体实现

步骤1:开启SpringAOP的注解功能

@Configuration
@ComponentScan("com.dcxuexi")
@EnableAspectJAutoProxy
public class SpringConfig {
}

步骤2:编写通知类

@Component
@Aspect
public class ResourcesAdvice {

    @Pointcut("execution(* com.dcxuexi.service.*Service.*(*,*))")
    public void ptService(){}
    
}

步骤3:添加环绕通知

@Component
@Aspect
public class ResourcesAdvice {

    @Pointcut("execution(* com.dcxuexi.service.*Service.*(*,*))")
    public void ptService(){}

    //@Around("ptService()") 这两种写法都对
    @Around("ResourcesAdvice.ptService()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object proceed = proceedingJoinPoint.proceed();

        return proceed;
    }
    
}

步骤4:完成核心业务,处理参数中的空格

@Component
@Aspect
public class ResourcesAdvice {

    @Pointcut("execution(* com.dcxuexi.service.*Service.*(*,*))")
    public void ptService(){}

    //@Around("ptService()") 这两种写法都对
    @Around("ResourcesAdvice.ptService()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //获取原始方法的参数
        Object[] args = proceedingJoinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            //判断参数是不是字符串
            if (args[i].getClass().equals(String.class)){
                args[i] = args[i].toString().trim(); // 去重空格
            }
        }
        // 将修改后的值传到原始方法的执行中
        Object proceed = proceedingJoinPoint.proceed(args);
        return proceed;
    }
    
}

步骤5:运行程序

不管密码1234前后是否加空格,最终控制台打印的都是true

步骤6:优化测试

为了能更好的看出AOP已经生效,我们可以修改ResourcesImpl类,在方法中将密码的长度进行打印

@Repository
public class ResourcesDaoImpl implements ResourcesDao {
    public boolean readResources(String url, String password) {
        System.out.println("密码长度 :"+password.length());
        //模拟校验
        return password.equals("1234");
    }
}

再次运行成功,就可以根据最终打印的长度来看看,字符串的空格有没有被去除掉。

注意:

在这里插入图片描述


项目代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.D.Chuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值