分布式微服务系统架构第142集:全栈开发

news2025/12/14 23:34:30

加群联系作者vx:xiaoda0423

仓库地址:https://webvueblog.github.io/JavaPlusDoc/

https://1024bat.cn/

https://github.com/webVueBlog/fastapi_plus

https://webvueblog.github.io/JavaPlusDoc/


/**
 * 本地启动解决跨域问题
 *  打包发布请注释该类,可能会造成一定的影响,解决本地启动跨域问题
 */
@Override
public  void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws ServletException, IOException {
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    //设置响应内容类型
    response.setContentType("application/json; charset=utf-8");
    //设置响应字符编码
    response.setCharacterEncoding("UTF-8");
    //设置Access-Control-Max-Age,表示在3600秒内不需要再次发送预检请求
    response.setHeader("Access-Control-Max-Age", "3600");
    //设置允许的HTTP请求方法
    response.setHeader("Access-Control-Allow-Methods", "POST, GET,PUT, OPTIONS, DELETE");
    //设置允许的跨域请求来源
    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    //设置是否允许发送Cookie
    response.setHeader("Access-Control-Allow-Credentials", "true");
    //设置允许的请求头
    response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, token");
    //继续执行过滤器链
    filterChain.doFilter(request, response);
}
用户提交表单会携带验证码相关参数,产品应用在相关接口处将该参数传给 集成jar包相关接口做二次校验,以确保该次验证是正确有效的。

引入相关组件,调用初始化函数,通过配置的一些参数信息。将行为验证码渲染出来。
<dependency>
    <groupId>com.anji-plus</groupId>
    <artifactId>spring-boot-starter-captcha</artifactId>
    <version>1.3.0</version>
</dependency>
缓存实现
public interface CaptchaCacheService {

    void set(String key, String value, long expiresInSeconds);

    boolean exists(String key);

    void delete(String key);

    String get(String key);

    /**
     * 缓存类型-local/redis/memcache/..
     * 通过java SPI机制,接入方可自定义实现类
     * @return
     */
    String type();
}
二次校验接口
请求方式
请求参数
响应参数
异常代号
登录为例,用户在提交表单到产品应用后台,会携带一个验证码相关的参数。产品应用会在登录接口login中将该参数传给集成jar包中相关接口做二次校验。
接口地址:https://****/captcha/verify
HTTP POST, 接口仅支持POST请求, 且仅接受 application/json 编码的参数

参数

类型

必填

备注

captchaVerification

String

Y

验证数据,aes加密,数据在前端success函数回调参数中获取

参数

类型

必填

备注

repCode

String

Y

异常代号

success

Boolean

Y

成功或者失败

error

Boolean

Y

接口报错

repMsg

String

Y

错误信息

error

说明

0000

无异常,代表成功

9999

服务器内部异常

0011

参数不能为空

6110

验证码已失效,请重新获取

6111

验证失败

6112

获取验证码失败,请联系管理员

引入前端vue组件, npm install axios    crypto-js   -S

CryptoJS是一个JavaScript的加解密的工具包

<template>
    <Verify
       @success="'success'" //验证成功的回调函数
       :mode="'fixed'"     //调用的模式
       :captchaType="'blockPuzzle'"    //调用的类型 点选或者滑动   
       :imgSize="{ width: '330px', height: '155px' }"//图片的大小对象
    ></Verify
</template>

<script>
//引入组件
import Verify from "./../../components/verifition/Verify";
export default {
    name: 'app',
    components: {
       Verify
    }
    methods:{
       success(params){
       // params 返回的二次验证参数
       }
    }
}
</script>

事件

参数

说明

success

验证码匹配成功后的回调函数

error

验证码匹配失败后的回调函数

ready

验证码初始化成功的回调函数

验证码参数

参数

说明

captchaType

1)滑动拼图 blockPuzzle  2)文字点选 clickWord

mode

验证码的显示方式,弹出式pop,固定fixed,默认是:mode : ‘pop’

vSpace

验证码图片和移动条容器的间隔,默认单位是px。如:间隔为5px,设置vSpace:5

explain

滑动条内的提示,不设置默认是:'向右滑动完成验证'

imgSize

其中包含了width、height两个参数,分别代表图片的宽度和高度,支持百分比方式设置 如:{width:'100%',height:'200px'}

blockSize

其中包含了width、height两个参数,分别代表拼图块的宽度和高度,如:{width:'40px',height:'40px'}

barSize

其中包含了width、height两个参数,分别代表滑动条的宽度和高度,支持百分比方式设置,如:{width:'100%',height:'40px'}

{
    "captchaType": ""  //验证码类型
}

在CentOS 4.x开始用 fontconfig 来安装字体库,所以输入以下命令即可:

sudo yum -y install fontconfig

这段代码是一个 Spring Bean 的定义,涉及到一个名为 AjCaptchaCacheService 的服务的初始化过程。具体是根据 AjCaptchaProperties 配置来创建一个 CaptchaCacheService 实例。这里面包含了对不同缓存类型的支持(比如 Redis 本地缓存等),并且在特定条件下做了额外的配置(例如设置 Redis 模板)。以下是对代码的逐行解析:

1. @Bean(name = "AjCaptchaCacheService")

  • 作用:这个注解表示该方法是一个 Spring Bean,AjCaptchaCacheService 是这个 Bean 的名字。Spring 会将这个方法的返回值注册为一个 Bean,并且在上下文中可以通过这个名字来获取该 Bean。

2. @Primary

  • 作用:这个注解标记了该 Bean 为优先使用的 Bean。如果 Spring 容器中有多个相同类型的 Bean 时,@Primary 表示该 Bean 会作为默认的选择进行注入,避免需要手动指定 @Qualifier

3. public CaptchaCacheService captchaCacheService(AjCaptchaProperties config)

  • 方法签名:这个方法定义了一个名为 captchaCacheService 的 Bean,返回类型是 CaptchaCacheService,并且接收一个 AjCaptchaProperties 类型的参数 config,它是从 Spring 容器中注入的配置对象。AjCaptchaProperties 可能包含了与验证码相关的配置,比如缓存类型、过期时间等。

4. CaptchaCacheService ret = CaptchaServiceFactory.getCache(config.getCacheType().name());

  • 功能:这一行代码通过 CaptchaServiceFactory 工厂类的 getCache 方法,根据 config.getCacheType().name() 获取对应的缓存服务类型,并返回一个 CaptchaCacheService 实例。config.getCacheType().name() 的值(例如 "REDIS" 或 "LOCAL")可能指定了缓存的类型。

    • 如果 config.getCacheType() 为 Redis 缓存类型,则 getCache() 会返回一个 CaptchaCacheServiceRedisImpl 类型的实例。

    • 如果是本地缓存或其他缓存类型,则返回不同的实现类。

5. if(ret instanceof CaptchaCacheServiceRedisImpl){

  • 功能:如果返回的 CaptchaCacheService 是 CaptchaCacheServiceRedisImpl 类型的实例(即是 Redis 缓存实现),则进入这个 if 分支进行进一步配置。

6. ((CaptchaCacheServiceRedisImpl) ret).setStringRedisTemplate(redisTemplate);

  • 功能:这行代码是将 StringRedisTemplate 设置到 CaptchaCacheServiceRedisImpl 实例中。StringRedisTemplate 是 Redis 操作的一个 Spring 模板类,它提供了对 Redis 字符串数据的封装,简化了 Redis 操作。

    • redisTemplate 可能是一个已经注入到当前类中的 Redis 模板实例,这里通过 setStringRedisTemplate 方法将其设置到 CaptchaCacheServiceRedisImpl 实例中,使得该实例能够使用 StringRedisTemplate 进行 Redis 操作。

7. return ret;

  • 功能:返回创建好的 CaptchaCacheService 实例(ret)。这个实例会被 Spring 容器管理,并且可以在需要使用 CaptchaCacheService 的地方注入和使用。


代码总结

该方法根据 AjCaptchaProperties 配置动态选择一个缓存类型,并根据缓存类型初始化 CaptchaCacheService 实例。若缓存类型为 Redis,则进一步注入 StringRedisTemplate 以支持 Redis 操作。最终返回的 CaptchaCacheService 实例会作为 Bean 被 Spring 容器管理和注入使用。

适用场景

这种方式适用于需要根据配置来灵活选择缓存类型的场景。例如,当缓存方式可以在 Redis 和本地缓存之间切换时,采用这种方法可以避免在不同环境中修改大量的代码,便于配置化管理。

@Bean(name = "AjCaptchaCacheService") 是 Spring 中用来定义 Bean 的一种方式,name 属性的作用和为什么这么写可以从以下几个方面来理解:

1. name 属性的作用

在 Spring 中,@Bean 注解用来定义一个 Bean,name 属性则指定该 Bean 的名称。默认情况下,如果没有指定 name,Spring 会根据方法名(即 captchaCacheService)作为 Bean 的名称。

示例:

@Bean(name = "AjCaptchaCacheService")
public CaptchaCacheService captchaCacheService(AjCaptchaProperties config) {
    //...
}

这里,@Bean(name = "AjCaptchaCacheService") 表示将该 Bean 注册到 Spring 容器时,使用 AjCaptchaCacheService 作为其名称。也就是说,在 Spring 容器中,这个 CaptchaCacheService 的实例将被引用为 AjCaptchaCacheService

默认名称与自定义名称的区别:
  • 如果没有指定 name,Spring 会将 Bean 的名称默认设置为方法名称(即 captchaCacheService)。

  • 如果指定了 name,则这个 Bean 会以指定的名称(即 AjCaptchaCacheService)注册到容器中。

2. 为什么这么写

在这个上下文中,给 Bean 指定一个明确的名称有几个目的:

  • 避免命名冲突:假设 Spring 容器中有多个 CaptchaCacheService 类型的 Bean,如果不指定名称,Spring 会使用方法名称(captchaCacheService)作为默认的名称。如果容器中已经存在一个名为 captchaCacheService 的 Bean,那么 Spring 就会发生冲突,导致注入失败。通过指定一个自定义名称(例如 AjCaptchaCacheService),可以确保唯一性。

  • 方便引用:指定名称后,可以在其他地方通过名称来引用该 Bean。例如,如果你需要通过 @Autowired 注入该 Bean,可以明确指定使用 AjCaptchaCacheService,避免因为默认名称造成的混淆。

  • 明确的命名意图AjCaptchaCacheService 作为 Bean 名称清楚表达了该 Bean 与 AjCaptchaProperties 和验证码相关,具备较好的可读性与语义性。

3. 相关注解和配置

@Primary 也在代码中出现,说明这个 Bean 是默认注入的优先选择。当有多个同类型的 Bean 时,Spring 会优先注入被标记为 @Primary 的 Bean。name 和 @Primary 结合使用,有助于明确在多个同类型 Bean 存在时,注入哪个 Bean。


总结

  • name 属性用来指定 Spring 容器中注册的 Bean 名称,避免命名冲突,增强可读性和可维护性。

  • 如果不指定,Spring 默认使用方法名作为 Bean 名称。

  • 在这个代码中,AjCaptchaCacheService 明确指定了该 Bean 的名称,避免了潜在的冲突,并且使代码的意图更加明确。

在 Java 项目中,META-INF 文件夹是一个非常特殊的目录,通常存在于项目的 resources 文件夹中,并且在项目打包成 .jar 或 .war 等格式时,会被保留在其中。META-INF 目录的主要作用是存放关于 JAR 文件或者类路径下的元数据信息。它的内容通常与 Java 类加载、服务发现、JAR 描述、加密算法等方面有关。

META-INF 目录的常见用途和内容

  1. META-INF/MANIFEST.MF

  • Manifest-Version 表示 manifest 文件的版本;

  • Class-Path 用来指定该 JAR 依赖的外部类库;

  • Main-Class 表示执行该 JAR 文件时的主类。

  • 作用:这是最常见的文件,它包含了关于 JAR 文件的元数据。MANIFEST.MF 文件包含了 JAR 文件的版本、类路径、主类、作者信息等。

  • 示例

    Manifest-Version: 1.0
    Class-Path: lib/some-library.jar
    Main-Class: com.example.Main
  • 其中:

  • 服务提供者配置文件(META-INF/services/

    • 作用:Java 提供了一种服务加载机制,这让不同的组件可以通过接口约定和插件机制来进行解耦。通过在 META-INF/services/ 目录下定义一个以接口全限定类名命名的文件,并列出服务实现类的全限定名,Java 程序可以在运行时动态加载实现类。

    • 示例
      假设有一个接口 com.example.PaymentProcessor,在 META-INF/services/com.example.PaymentProcessor 文件中可以列出实现该接口的具体类名:

      com.example.impl.PayPalProcessor
      com.example.impl.StripeProcessor
    • 这种机制使得 Java 可以根据接口找到不同的实现类,常见的应用场景包括 SPI(Service Provider Interface)和一些依赖注入框架。

  • **META-INF/spring.factories**(在 Spring 框架中)

    • 作用:Spring 框架使用这个文件来进行自动化配置。spring.factories 文件允许将配置文件、Bean 定义、自动装配逻辑与应用的主要代码解耦,自动加载相关配置和组件。

    • 示例

      org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
      org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
  • **META-INF/beans.xml**(在 Java EE 中)

    • 作用beans.xml 是一个配置文件,它定义了一个 Java EE 应用中包含的 CDI(Context and Dependency Injection)Bean。它的作用是启用 CDI 容器,控制和管理类的生命周期。

    • 示例

      <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_0.xsd">
      </beans>
  • **META-INF/persistence.xml**(在 JPA 中)

    • 作用:在 Java 持久化 API(JPA)中,persistence.xml 文件包含了数据源、实体管理器工厂和 JPA 的其他配置。这个文件一般放在 META-INF/ 目录下。

    • 示例

      <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
          <persistence-unit name="myJpaUnit">
              <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
              <jta-data-source>java:/MyDataSource</jta-data-source>
              <class>com.example.MyEntity</class>
          </persistence-unit>
      </persistence>
  • META-INF/manifest.mf

    • 作用:在 OSGi(开放服务网关 initiative)中,META-INF/ 目录也用于存放 MANIFEST.MF 文件,这个文件描述了包的相关信息,如 Bundle-SymbolicName,Bundle-Version 等。

  • 加密算法相关的文件

    • 作用:在一些使用加密功能的 Java 应用中,META-INF 目录还可能包含一些与加密相关的文件,例如签名证书、私钥、公钥、加密算法配置等。

    • 例如,JCE(Java Cryptography Extension)使用 META-INF 中的策略文件来指定可用的加密算法。

    总结

    META-INF 目录是 Java 项目中的重要文件夹,通常用于存放与 Java 应用的元数据、配置、服务发现、加密算法等相关的文件。它对于支持 JAR 文件的服务发现、插件机制、自动化配置等非常重要,特别是在使用 Spring 或 JPA 等框架时经常会遇到。在打包成 JAR 文件时,META-INF 会被保留下来,从而使得应用能够根据这些配置文件进行运行时的动态行为调整。

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

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

相关文章

PTA-根据已有类Worker,使用LinkedList编写一个WorkerList类,实现计算所有工人总工资的功能。

目录 1.问题描述 2.函数接口定义&#xff1a; 3.裁判测试程序样例&#xff1a; 4.输入和输出样例 输入样例&#xff1a; 输出样例&#xff1a; 5.实现代码 1.问题描述 Main类&#xff1a;在main方法中&#xff0c;调用constructWorkerList方法构建一个Worker对象链表…

微软markitdown PDF/WORD/HTML文档转Markdown格式软件整合包下载

本次和大家分享另一个微软发布的非常热门的文件文档转Markdown格式文档的软件markitdown&#xff0c;软件可以将PDF&#xff0c;word&#xff0c;ppt&#xff0c;Excel等十几种格式文档转换为markdown格式文档&#xff0c;我基于当前最新0.1.2版本制作了免安装一键启动整合包。…

BayesFlow:基于神经网络的摊销贝叶斯推断框架

贝叶斯推断为不确定性条件下的推理、复杂系统建模以及基于观测数据的预测提供了严谨且功能强大的理论框架。尽管贝叶斯建模在理论上具有优雅性&#xff0c;但在实际应用中经常面临显著的计算挑战&#xff1a;后验分布通常缺乏解析解&#xff0c;模型验证和比较需要进行重复的推…

基于FPGA的DES加解密系统verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于FPGA的DES加解密系统verilog实现,包含testbench和开发板硬件测试。输入待加密数据&#xff0c;密钥&#xff0c;输出加密数据&#xff0c;然后通过解密模块输出解密后的原…

Python----目标检测(《用于精确目标检测和语义分割的丰富特征层次结构》和R-CNN)

一、《用于精确目标检测和语义分割的丰富特征层次结构》 1.1、基本信息 原文标题&#xff1a;Rich feature hierarchies for accurate object detection and semantic segmentation 中文译名&#xff1a;用于精确目标检测与语义分割的丰富特征层次结构 版本&#xff1a;第5版技…

极简以太彩光网络解决方案4.0正式发布,“彩光”重构园区网络极简之道

5月28日下午,锐捷网络在京举办以“光,本该如此‘简单’”为主题的发布会,正式发布极简以太彩光网络解决方案4.0。作为“彩光”方案的全新进化版本,极简以太彩光4.0从用户需求出发,聚焦场景洞察,开启了一场从底层基因出发的极简革命,通过架构、部署、运维等多维度的创新升级,以强…

国芯思辰| 霍尔电流传感器AH811为蓄电池负载检测系统安全护航

在电动车、储能电站、不间断电源&#xff08;UPS&#xff09;等设备中&#xff0c;蓄电池作为关键的储能单元&#xff0c;其运行状态直接关系到设备的稳定性和使用寿命。而准确监测蓄电池的负载情况&#xff0c;是保障其安全、高效运行的关键。霍尔电流传感器 AH811凭借独特的技…

TortoiseSVN账号切换

SVN登录配置及账号切换 本文主要为了解答svn客户端如何进行账号登录及切换不同权限账号的方式。 一、环境准备与客户端安装 安装TortoiseSVN客户端 ​​下载地址​​&#xff1a;TortoiseSVN官网 ​​安装步骤​​&#xff1a; 双击安装包&#xff0c;按向导完成安装后&#x…

2025年05月28日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;10352今日star数&#xff1a;2444项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

篇章五 数据结构——链表(一)

目录 1.ArrayList的缺陷 2. 链表 2.1 链表的概念及结构 2.2 链表结构 1. 单向或者双向 2.带头或者不带头 3.循环或者非循环 2.3 链表的实现 1.完整代码 2.图解 3.显示方法 4.链表大小 5. 链表是否存在 key 值 6.头插法 7.尾插法 8.中间插入 9.删除key值节点 10.…

一文清晰理解目标检测指标计算

一、核心概念 1.交并比IoU 预测边界框与真实边界框区域的重叠比&#xff0c;取值范围为[0,1] 设预测边界框为&#xff0c;真实边界框为 公式&#xff1a; IoU计算为两个边界框交集面积与并集面积之比&#xff0c;图示如下 IoU值越高&#xff0c;表示预测边界框与真实边界框的对…

Artificial Analysis2025年Q1人工智能发展六大趋势总结

2025年第一季度人工智能发展六大趋势总结 ——基于《Artificial Analysis 2025年Q1人工智能报告》 趋势一&#xff1a;AI持续进步&#xff0c;竞争格局白热化 前沿模型竞争加剧&#xff1a;OpenAI凭借“o4-mini&#xff08;高智能版&#xff09;”保持领先&#xff0c;但谷歌&…

高效管理 Python 项目的 UV 工具指南

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 持续学习&#xff0c;不断…

初识vue3(vue简介,环境配置,setup语法糖)

一&#xff0c;前言 今天学习vue3 二&#xff0c;vue简介及如何创建vue工程 Vue 3 简介 Vue.js&#xff08;读音 /vjuː/&#xff0c;类似 “view”&#xff09;是一款流行的渐进式 JavaScript 框架&#xff0c;用于构建用户界面。Vue 3 是其第三代主要版本&#xff0c;于 …

LeetCode-链表操作题目

虚拟头指针&#xff0c;在当前head的前面建立一个虚拟头指针&#xff0c;然后哪怕当前的head的val等于提供的val也能进行统一操作 203移除链表元素简单题 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(…

【ARM】MDK浏览信息的生成对于构建时间的影响

1、 文档目标 用于了解MDK的代码浏览信息的生成对于工程的构建是否会产生影响。 2、 问题场景 客户在MDK中使用Compiler 5对于工程进行构建过程中发现&#xff0c;对于是否产生浏览信息会对于构建时间产生一定的影响。在Options中Output栏中勾选了Browse Information后&#…

py爬虫的话,selenium是不是能完全取代requests?

selenium适合动态网页抓取&#xff0c;因为它可以控制浏览器去点击、加载网页&#xff0c;requests则比较适合静态网页采集&#xff0c;它非常轻量化速度快&#xff0c;没有浏览器开销&#xff0c;占用资源少。当然如果不考虑资源占用和速度&#xff0c;selenium是可以替代requ…

docker B站学习

镜像是一个只读的模板&#xff0c;用来创建容器 容器是docker的运行实例&#xff0c;提供了独立可移植的环境 https://www.bilibili.com/video/BV11L411g7U1?spm_id_from333.788.videopod.episodes&vd_sourcee60c804914459274157197c4388a4d2f&p3 目录挂载 尚硅谷doc…

SpringBoot高校宿舍信息管理系统小程序

概述 基于SpringBoot的高校宿舍信息管理系统小程序项目&#xff0c;这是一款非常适合高校使用的信息化管理工具。该系统包含了完整的宿舍管理功能模块&#xff0c;采用主流技术栈开发&#xff0c;代码结构清晰&#xff0c;非常适合学习和二次开发。 主要内容 这个宿舍管理系…

ICASSP2025丨融合语音停顿信息与语言模型的阿尔兹海默病检测

阿尔兹海默病&#xff08;Alzheimers Disease, AD&#xff09;是一种以认知能力下降和记忆丧失为特征的渐进性神经退行性疾病&#xff0c;及早发现对于其干预和治疗至关重要。近期&#xff0c;清华大学语音与音频技术实验室&#xff08;SATLab&#xff09;提出了一种将停顿信息…