百度网盘密码数据兼容处理

news2024/9/23 15:30:45

文章目录

      • 一、问题描述
      • 二、代码实现
        • 1. 配置类
        • 2. 数据库配置
        • 3. config 配置类
        • 4. AOP 通知类
        • 5. 数据层
        • 6. 业务层
        • 7. 实体类
      • 三、测试及结果

一、问题描述

需求:
对百度网盘分享链接输入密码时尾部多输入的空格做兼容处理。
分析:
① 在业务方法执行之前对所有的输入参数进行格式处理,trim() 方法用于删除字符串的头尾空白符;
② 使用处理后的参数调用原始方法,AOP 环绕通知中存在对原始方法的调用。

二、代码实现

1. 配置类

这里需要导入一些依赖,Spring 依赖、Junit 测试依赖、mybatis 依赖、Spring 整合 mybatis 依赖、MySQL 依赖、Spring 整合 jdbc 依赖、阿里的数据源依赖以及我们的 AOP 所需要的 aspectjweaver 依赖,如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Spring_AOP</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.9</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.3.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
    </dependencies>
</project>

2. 数据库配置

这里是数据库信息,jdbc.properties 文件:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ZXEdb?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=123456bb

3. config 配置类

① SpringConfig 类的出现是为了替代原先的配置文件。

package com.zxe.config;

import org.springframework.context.annotation.*;

@Configuration
@ComponentScan("com.zxe")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class, MybatisConfig.class})
@EnableAspectJAutoProxy
public class SpringConfig {
}

② JdbcConfig 类单独拿出来,配置数据库相关数据源信息。

package com.zxe.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class JdbcConfig {
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String userName;
    @Value("${jdbc.password}")
    private String password;
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        return dataSource;
    }
}

③ MybatisConfig 类是固定格式,一个是数据池,另一个是映射文件。

package com.zxe.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class MybatisConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setTypeAliasesPackage("com.zxe.domain");
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.zxe.dao");
        return mapperScannerConfigurer;
    }
}

4. AOP 通知类

该类用于定义切入点和通知,并绑定它们的关系,用环绕注解实现在执行 openURL 方法前先对传来的数据进行格式处理,这也是问题处理的关键。

package com.zxe.aop;

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.springframework.stereotype.Component;

@Component
@Aspect
public class MyAdvice {
    //定义切入点
    @Pointcut("execution(boolean com.zxe.service.*Service.*(*,*))")
    private void servicePt() {}
    //绑定关系
    @Around("MyAdvice.servicePt()")
    public Object trimStr(ProceedingJoinPoint pjp) throws Throwable {
        //在执行openURL方法前先对传来的数据进行格式处理
        Object[] args = pjp.getArgs();
        for (int i = 0; i < args.length; i++) {
            //判断是不是字符串
            if (args[i].getClass().equals(String.class)) {
                args[i] = args[i].toString().trim();
            }
        }
        //将修改后的参数传入原始方法中
        Object ret = pjp.proceed(args);
        return ret;
    }
}

5. 数据层

这里用的是 Mybatis 的注解开发,自动代理出的实现类对象,所以不需要再写实现类。

package com.zxe.dao;

import org.apache.ibatis.annotations.Select;

public interface ResourcesDao {
    @Select("select pwd from t_password where url = #{url}")
    public String readPassword(String url);
}

6. 业务层

Service 层对从 Dao 层取过来的数据进行处理,密码校验,此时的数据已是环绕通知之后修改过的数据。

package com.zxe.service.impl;

import com.zxe.dao.ResourcesDao;
import com.zxe.service.ResourcesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ResourcesServiceImpl implements ResourcesService {
    @Autowired
    private ResourcesDao resourcesDao;
    @Override
    public boolean openURL(String url, String password) {
        String pwd = resourcesDao.readPassword(url);
        boolean flag = pwd.equals(password);
        return flag;
    }
}

7. 实体类

用于数据映射。

package com.zxe.domain;

public class Admin {
    private String url;
    private String password;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

三、测试及结果

package com.zxe;

import com.zxe.config.SpringConfig;
import com.zxe.service.ResourcesService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new AnnotationConfigApplicationContext(SpringConfig.class);
        ResourcesService resourcesService = ac.getBean(ResourcesService.class);
        boolean flag = resourcesService.openURL("http://pan.baidu.com.haha", "zhanlaoshi123");
        System.out.println(flag);
    }
}

在这里插入图片描述

在这里插入图片描述

有时候用户输入的密码是对的,但是会不小心在开头或者结尾多输入空格,我们利用 AOP 来解决这个问题,在业务方法执行之前对所有的输入参数进行格式处理,也就是自动去除掉多余的空格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/498864.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目标检测YOLO(V1、V2、V3)入门

one-stage和two-stage的区别 YOLO常见的指标 YOLO V1 yolo v1架构解读 yolo v1损失函数 NMS非极大值抑制 yolo v1版本的问题 重叠在一起的物体不好分类&#xff0c;只是一个单分类问题多标签问题&#xff08;狗和哈士奇&#xff09; v2和v1的区别 v2网络结构 batch normaliz…

【iOS】---pthread,NSThread

在iOS中多线程开发有四种方式&#xff0c;在之前我们浅浅了解了一下GCD&#xff0c;这期来看看pthread和NSThread pehread pthread简介 pthread 是一套通用的多线程的 API&#xff0c;可以在Unix / Linux / Windows 等系统跨平台使用&#xff0c;使用 C 语言编写&#xff0c;…

Redis持久化之RDB高频问题

1、RDB是如何应用的&#xff1f; 因为记录的是操作命令&#xff0c;而不是实际的数据&#xff0c;所以&#xff0c;用 AOF 方法进行故障恢复的时候&#xff0c;需要逐一把操作日志都执行一遍。如果操作日志非常多&#xff0c;Redis 就会恢复得很缓慢&#xff0c;影响到正常使用…

ApacheBench网站压力测试

ApacheBench &#xff08;简称ab&#xff09;是一个指令列程式&#xff0c;可用于网站压力测试&#xff0c;亦可用于发起CC攻击&#xff0c;请不要滥用哦。ApacheBench &#xff08;简称ab&#xff09;是一个指令列程式&#xff0c;可用于网站压力测试。如果已经安装过Apache&a…

Linux基本指令----上

Linux基本指令----上 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令&&rm指令man指令cp指令mv指令cat指令echo指令more指令less指令head指令tail指令结语 ls指令 语法&#xff1a; ls [选项] [目录或文件] 功能&#xff1a; 对于目录&#xff0c;该命令列出该目录下…

Spring Boot集成ShardingSphere实现按月数据分片及创建自定义分片算法 | Spring Cloud 44

一、前言 在前面我们通过以下章节对数据分片有了基础的了解&#xff1a; Spring Boot集成ShardingSphere实现数据分片&#xff08;一&#xff09; | Spring Cloud 40 Spring Boot集成ShardingSphere实现数据分片&#xff08;二&#xff09; | Spring Cloud 41 Spring Boot集…

【Windows】高效的本地文件搜索工具《Everything》

&#x1f433;好用高效的本地文件搜索工具《Everything》 &#x1f9ca;一、什么是Everything&#x1f9ca;二、为什么选择Everything&#x1f9ca;三、下载Everything&#x1f9ca;四、Everything为什么高效 &#x1f9ca;一、什么是Everything Everything是一个运行于Window…

单片机GD32F303RCT6 (Macos环境)开发 (五)—— IAP代码架构工程

IAP代码架构工程 1、IAP一般分两个工程&#xff0c;一个Bootloader工程&#xff0c;一个Application工程。 这两个工程的差异后面会讲。 IAP架构工程的好处在于产品上线以后&#xff0c;想要升级的话&#xff0c;不用借助烧录器&#xff0c;就可以完成产品的软件升级。 2、Boo…

轻量级团队协作工具推荐,提高效率从选择开始

首先不得不夸一句&#xff1a;爱用Zoho工具的人&#xff0c;都十分自律和高效&#xff0c;因为Zoho旗下有多种简单好用的团队协作工具。 1、Zoho Projects项目管理工具 项目任务进度和团队沟通与协作管理软件Zoho Projects是一款基于web的软件。专为团队协作而设计&#xff0c;…

手写卡尔曼滤波

形象图 里面的my_Kalman.ipynb 和ppt就是了&#xff0c;其他的是原始资料和 辅助函数 链接&#xff1a;https://pan.baidu.com/s/1J1nA–oqoj8OvgbrA3LfbQ?pwd1264 提取码&#xff1a;1264 import numpy as np import matplotlib.pyplot as plt from matplotlib.animation i…

物理验证LVS对bulk(体)的理解和处理技巧

对于物理验证中的LVS&#xff0c;需要对各种物理器件进行SpiceVsGDS的比对&#xff0c;基于现在流行的std-cell的库的设计方法&#xff0c;LVS需要对CMOS器件多相应的处理&#xff0c;这里会涉及到一些具体的物理库的知识和小的技巧&#xff0c;这里结合具体的物理设计和CDL形态…

网络安全战略:如何应对不断变化的威胁环境?

网络安全一直是大家所关注的重点。在如今的数字化时代&#xff0c;网络安全问题日益严峻&#xff0c;网络攻击者使用更加复杂和高级的攻击方式&#xff0c;企图从各种角度入侵和危害我们的计算机网络。因此&#xff0c;我们必须制定一套完善的网络安全战略&#xff0c;以便更好…

LeetCode 牛客单链表OJ题目分享

目录 链表的回文结构相交链表环形链表I环形链表II 链表的回文结构 链接: link 题目描述&#xff1a; 题目思路&#xff1a; 本题思路是找到每一条链表的中间节点&#xff0c;之后逆置中间节点之后的链表&#xff0c;定义两个指针&#xff0c;分别指向逆置后链表的头部的链表的…

8年资深测试总结,性能测试基础知识(大全)你的进阶之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

力扣sql中等篇练习(十七)

力扣sql中等篇练习(十七) 1 计算布尔表达式的值 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # 使用SELECT子句中的子查询查询到对应的值 SELECT t1.left_operand,t1.operator,t1.right_operand,cas…

Obsidian templater日记模板添加一个随机问题

Obsidian templater日记模板添加一个随机问题 简介 每天日记里写同样的东西&#xff0c;感觉有点无聊&#xff0c;想问自己一些问题&#xff0c;每天不同。 查到有插件random structural diary&#xff0c;我想要的功能就是这样&#xff0c;但是没懂这个插件怎么放进templat…

【Android入门到项目实战-- 9.3】—— 加速度传感器的详细使用教程

基础知识 加速度传感器可以返回x、y、z三轴的加速度数值&#xff0c;该数值受地心引力的影响。 将手机平放桌面上&#xff0c;x、y、z轴默认为9.81&#xff1b;手机向下z轴为-9.81。 将手机向左倾斜&#xff0c;x轴为正&#xff0c;向右倾斜&#xff0c;x为负&#xff1b; 将手…

Windows11安装hadoop-3.3.0

一、安装Java 1. 下载Java 进入下载页面Java Archive Downloads - Java SE 8 Java SE Development Kit 8u191中 选择适合操作系统的下载文件 在安装好的路径下&#xff0c;将Java目录复制到C:\根目录下&#xff0c;形成C:\Java\jdk1.8.0_191目录结构 2. 设置环境变量 二、…

Docker虚拟化概念

Docker虚拟化概念 1、虚拟化技术的概念 虚拟化技术主要是将物理资源转变为逻辑上可以管理的资源&#xff1b;用以打破物理资源结构之间的壁垒&#xff1b;让计算的原件运行在虚拟的基础之上&#xff1b;而不是直接运行在硬件设备资源上&#xff1b; 说白了就是硬件资源转变成…

大数据开会记录【NiFi数据集成、AllData数据中台管理系统、RuoYi】

今天上午和下午开了个小会&#xff0c;上午说了一下Nifi&#xff0c;下午具体说了一下nifi和ruoyi。 目录 上午 下午 上午 三个人开会。 上次说的挖掘平台&#xff0c;您这边是否有技术人员对nifi比较熟悉&#xff0c;并且能够将相关功能集成到数据中台系统中。 现在结构化的…