java第三阶段面试题

目录

1.Maven的依赖范围有哪些?

2.MyBatis中#和$符号的区别?

3.MyBatis中如何传递多个参数?

4.MyBatis动态SQL是做什么的?都有哪些动态SQL?能简述⼀下动态SQL的执⾏原理不?

5.MyBatis 能执⾏一对一、一对多的关联查询吗?都有哪些实现⽅式,以及它们之间的区别。

6.什么是IOC?什么是DI?举例子说明?

7.Spring IOC和DI的常用注解有哪些?

8.AOP底层原理使用了什么设计模式?介绍一下该设计模式?

9.简述事务的ACID特性。

10.简述SpringMVC请求处理流程,以及有哪些核心组件?

11.简述你对SpringBoot的理解。

12.简述什么是 Spring Boot Stater?

13.SpringBoot自动配置的原理。

14.简述Spring Security安全框架的认证流程。

15.简述Spring Security安全框架的授权流程。


1.Maven的依赖范围有哪些?

pom文件如下配置:

   <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.7</version>
     <scope>test</scope>
   </dependency>

其scope标签就是依赖范围的配置,默认是compile,可选配置有test、provided、runtime、system、import

既<scope>标签的可选配置:compile、test、provided、runtime、system、import,下面一一介绍

1)编译依赖范围(compile),该范围就是默认依赖范围,此依赖范围对 于编译、测试、运行三种classpath都有效,举个简单的例子,假如项目中有spring-core的依赖,那么spring-core不管是在编译,测试,还是运行都会被用到,因此spring-core必须是编译范围(构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定)

    <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>2.5</version>
     <scope>compile</scope> <!--默认为该依赖范围,无须显示指定--〉
    </dependency>

2)测试依赖范围(test),顾名思义就是针对于测试的,使用此依赖范围的依赖,只对测试classpath有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为<scope>test</scope> ,当然不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的classpath中,造成不必要的浪费 。

  <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.7</version>
     <scope>test</scope>
  </dependency>

3)已提供依赖范围(provided),使用该依赖范围的maven依赖,只对编译和测试的classpath有效,对运行的classpath无效,典型的例子就是servlet-api, 编译和测试该项目的时候需要该依赖,但是在运行时,web容器已经提供的该依赖,所以运行时就不再需要此依赖,如果不显示指定该依赖范围,并且容器依赖的版本和maven依赖的版本不一致的话,可能会引起版本冲突,造成不良影响。

   <dependency>
     <groupId>javax-servlet</groupId>
     <artifactId>servlet-api</artifactId>
     <version>2.0</version>
     <scope>provided</scope>
   </dependency>

4)运行时依赖范围(runtime),使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。

5),系统依赖范围(system),该依赖与classpath的关系与 provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:

   <dependency>
     <groupId>javax.sql</groupId>
     <artifactId>jdbc-stext</artifactId>
     <version>2.0</version>
     <scope>system</scope>
     <systemPath>${java.home}/lib/rt.jar</systemPath> 
   </dependency>

6)导入依赖范围(import),该依赖范围不会对三种classpath产生影响,该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。有关dependencyManagement的功能请了解maven继承特性。

2.MyBatis中#和$符号的区别?

1、符号类型
(1)#{}:参数占位符,即预编译
(2)${} :字符串替换符,即SQL拼接

2、防注入问题
(1)#{}:很大程度上能防止sql 注入
(2)${}:不能防止sql 注入

3、参数替换位置
DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。它提供多种功能,可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。

(1)#{}:变量替换是在DBMS 中
(2)${}:变量替换是在 DBMS 外

4、参数解析
(1)#{}:将传入的数据都当成一个字符串,会对传入的变量自动加一个单引号。如:user_id = #{userId},如果传入的值是111,那么解析成sql时的值为user_id = ‘111’,如果传入的值是id,则解析成的sql为user_id = ‘id’。

(2)${}:将传入的参数直接显示生成在sql中,且不加任何引号。如:user_id = ${userId},如果传入的值是111,那么解析成sql时的值为user_id = 111 , 如果传入的值是id,则解析成的sql为user_id = id。

5、用$的情况
(1)MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

       默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName},这里MyBatis不会修改或转义字符串。

(2)${}方式一般用于传入数据库对象,例如传入表名

Select  *  from  ${tableName}  where  user_id = #{userId}


6、sql执行过程
可参考“二”部分的案例
(1)#{}:编译好SQL后语句再去取值
(2)${}:取值以后再去编译SQL语句

7、一般能用#的就别用$
二、SQL解析
1、流程
(1)#{}:动态解析 -> 预编译 -> 执行
(2)${}:动态解析 -> 编译 -> 执行

2、案例
根据用户名name查询用户表user数据,如果 name 的值为 zhangsan
(1)SQL编写
#{}

select * from user where name = #{name};



${}

select * from user where name = ${name};



(2)(预)编译中的处理
#{}:在预处理时,会把参数用一个占位符" " 代替,变成以下SQL

select * from user where name = ?;


${}:只是简单的字符串替换,在动态解析时变成以下SQL

select * from user where name = 'zhangsan';


当然了,最后的解析结果是一样的,都是

select * from user where name = 'zhangsan';

3.MyBatis中如何传递多个参数?

方法1:顺序传参法(不推荐)

#{}里面的数字代表你传入参数的顺序。

这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。

方法2:@Param注解传参法(推荐)

#{}里面的名称对应的是注解 @Param括号里面修饰的名称。

这种方法在参数不多的情况还是比较直观的,推荐使用。

  1. 当接口中只有一个参数(并且没有用@Param())时候,需要在xml中添加响应的参数类型parameterType;

  2. 如果是多个参数(每个参数都是用@Param())的时候,就不会去读参数类型parameterType,

  3. 直接取得参数里面的值。

方法3:Map传参法(推荐)

#{}里面的名称对应的是 Map里面的key名称。

这种方法适合传递多个参数,且参数易变能灵活传递的情况。

方法4:Java Bean传参法(推荐)

#{}里面的名称对应的是 User类里面的成员属性。

这种方法很直观,但需要建一个实体类,扩展不容易,需要加属性,看情况使用。

4.MyBatis动态SQL是做什么的?都有哪些动态SQL?能简述⼀下动态SQL的执⾏原理不?

      动态sql就是(在进行sql操作的时候)动态的根据属性值(所匹配的条件)来拼接数据库执行的sql语句,也就是多次查询或变更操作,根据传入的属性值不同,动态拼接出不同的可执行sql。包含判断为空、循环等;

Mybatis动态sql(有哪些)标签:

1、<if>: 

if是为了判断传入的值是否符合某种规则,比如是否不为空;

2、<where>:

 where标签可以用来做动态拼接查询条件,当和if标签配合的时候,不用显示的声明类似where 1=1这种无用的条件;

3、<choose><when><otherwise>:

这是一组组合标签,他们的作用类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件;

4、<foreach>:

foreach标签可以把传入的集合对象进行遍历,然后把每一项的内容作为参数传到sql语句中,里面涉及到 item(具体的每一个对象), index(序号), open(开始符), close(结束符), separator(分隔符);

5、<include>:

include可以把大量重复的代码整理起来,当使用的时候直接include即可,减少重复代码的编写;

6、<set>:

适用于更新中,当匹配某个条件后,才会对该字段进行更新操作

7、<trim>:

是一个格式化标签,主要有4个参数:

    prefix(前缀);

    prefixOverrides(去掉第一个标记);

    suffix(后缀);

    suffixOverrides(去掉最后一个标记);

动态sql的执行原理:

第一部分:在启动加载解析xml配置文件的时候进行解析,根据关键标签封装成对应的handler处理对象,封装成sqlSource对象存在mappedStatement。

调用流程:

I、SqlSessionFactoryBuilder对builder对象的时候,调用XMLConfigBuilder解析sqlMapConfig.xml配置文件,在解析过程中使用到了私有的mapperElement(XNode parent)方法

II、上面方法中通过构建XMLMapperBuilder,获取到所有的配置mapper配置,

在调用private void configurationElement(XNode context)方法进行解析mapper.xml,通过void buildStatementFromContext(List<XNode> list, String requiredDatabaseId)方法解析mapper.xml内的每一个标签

III、循环中构建XMLStatementBuilder对象,调用parseStatementNode()方法来封装mappedStatment对象,

IIII、在过程中需要构建sqlSource对象,通过XMLLanguageDriver对象进行处理,在XMLLanguageDriver中构建解析动态标签对象XMLScriptBuilder

第二部分:在执行过程中获取sqlSource中获取bondSql对象时,执行相应的标签handler

调用查询执行到BaseExecutor的query方法时候会去getBoundSql并且将参数传进去,

在sqlSource接口DynamicSqlSource实现类中,调用getBoundSql方法执行过程共创建DynamicContext对象进行判定解析封装成SqlSource对象返回。

5.MyBatis 能执⾏一对一、一对多的关联查询吗?都有哪些实现⽅式,以及它们之间的区别。

MyBatis实现一对一有几种方式?具体怎么操作的?

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的结果的 外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。

MyBatis实现一对多有几种方式,怎么操作的?

有联合查询和嵌套查询。

联合查询是几个表联合查询,只查询一次,通过在resultMap里面的collection节点配置一对多的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的 结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

6.什么是IOC?什么是DI?举例子说明?

什么是控制反转(IOC)

Ioc—Inversion of Control,即“控制反转”,它是一种设计思想,并不是什么技术;在 Java 中,IOC 意味着将我们设计好的对象交给容器控制,而不是传统的需要时在内部构造直接控制;

谁控制谁?控制了什么?
  • 谁控制了谁: IoC 控制了对象;
  • 控制了什么: 主要控制了外部资源的获取,不仅限于对象,包括文件等资源;
什么为正转?什么为反转?

正转:在我们需要某个对象的时候,需要自己主动的去构建对象以及其所依赖的对象;
反转:在我们需要某个对象的时候,只需要在 IoC 容器中获取所需对象,无需关心创建过程以及其中的依赖对象;全盘由 IoC 容器帮我们创建对象以及注入其所依赖的对象,在这里我们把对象的控制权反转给了 IoC 容器,所以称为反转;

举个例子


在现实生活中,当我们要用到一样东西的时候,第一反应是去找到这样东西,当我们想吃红烧肉的时候,如果没有饭店的支持,我们需要准备:肉、油、白砂糖、佐料等等一系列东西,然后自己去做,在这个过程中,所有的东西都是自己创造的这个过程称为正转;

然而到了今天,生活变好了加上互联网的兴起,当我们想吃红烧肉的时候,第一反应是去外卖平台描述出我们的需求,通过提供联系方式和送货地址,最后下订单,过一会儿就会有人给我们把红烧肉送过来,在这个过程中,我们并没有主动的去创造红烧肉,红烧肉是外卖平台上的商家创造的,但也完全达到了我们的需求,这个过程称为反转。


什么是依赖注入(DI)


DI-Dependency Injection,即”依赖注入”,就是由容器动态的将某个依赖注入到组件中。通过依赖注入机制,我们只需要简单的配置,无需任何代码就可以指定目标所需要的资源,从而完成自身的业务逻辑;我们无需关心具体的资源来自何处,提升了系统灵活性和可扩展性。

IOC和DI的关系


DI 可以看作是 IoC 的一种实现方式,IoC 是一种思想,而 DI 是一种设计模式,是一种实现 IoC 的模式。

依赖注入的三种方式

  • 构造方法注入: 被注入的对象可以通过在其构造方法中声明参数列表,让 IoC 容器知道它需要依赖哪些对象
  • setter 注入: 为其需要依赖的对象增加 setter 方法,可以通过 setter 方法将其依赖的对象注入到对象中
  • 接口注入: 对于接口注入来说,如果被注入对象想要 IoC 容器为其注入依赖对象,就必须实现某个接口,这个接口提供了一个方法,用来为其注入依赖对象。但是从注入方式的使用来说,接口注入是现在不提倡的一种方式,基本处于”退役”状态,因为它强制被注入实现对象不必要的依赖。

7.Spring IOC和DI的常用注解有哪些?

1.@Autowired:用于注入数据的
            它们的作用就和在xml配置文件中的bean标签中写一个<property>标签的作用是一样的
            此注解先在扫描的bean中匹配class类,没有就找id ,找到全局唯一的就编译正确,否则错误,即有多个值或者没有就会报错
2.@Qualifier
            当有多个值或者没有值时,此时就需要它来进行指定 配合@Autowired注解一起使用
3.@Resource 
     直接按照bean的id名称注入。如果id属性不存在,可以再按照类型注入。它可以独立使用
     属性 name:用于指定bean的id,如果指定name,只能按照bean的id注入,不能按照类型注入
     以上三个注入都只能注入其他bean类型的数据,而基本类型和String类型无法使用上述注解实现(使用@Value)
4.@Configuration 
            表示该类是一个配置类,它的作用和applicationContext.xml是一样的
            当配置类作为AnnotationConfigApplicationContext对象创建时,该注解可以不写。
            public class MyConfigration {
            }
5.@ComponentScan
            作用:用于通过注解指定spring在创建容器时要扫描的包
            相当于:<context:component-scan base-package="com.itheima"></context:component-scan>
6.@Bean
       作用:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
       属性:  name:用于指定bean的id。当不写时,默认值是当前方法的名称
       依赖注入细节:
       我们使用注解配置方法时,如果方法有参数,spring框架会去容器中查找有没有可用的bean对象,如果有bean对象,
       将对象通过方法的形参注入到方法中使用。==查找的方式和Autowired注解的作用是一样的==
7.@PropertySource
            作用:用于指定properties文件的位置
            属性:
                value:指定文件的名称和路径。
            关键字:classpath,表示类路径下
8.AnnotationConfigApplicationContext 当配置类作为AnnotationConfigApplicationContext对象创建的参数时,@Configuration注解可以不写
9.@Import 作用:用于导入其他的配置类 value:用于指定其他配置类的字节码
当我们使用Import的注解之后,有Import注解的类就父配置类,而导入的都是子配置类 相当于applicationContext.xml中的<import resource=””>
10.@PropertySource 作用:用于指定properties文件的位置
            属性: value:指定文件的名称和路径。

            关键字:classpath,表示类路径下
11.@Qualifier注解  作用:如果spring容器中出现了多个数据源类型,使用该注解指定注入的数据源
12.@Runwith Junit提供的一个注解把原有的main方法替换了,替换成spring提供的
13.@ContextConfiguration:指定xml文件的位置,加上classpath关键字 
     @ContextConfiguration(locations = "classpath:applicationContext.xml")
 

8.AOP底层原理使用了什么设计模式?介绍一下该设计模式?

AOP的底层原理

AOP底层使用动态代理,分为两种情况。

(1)有接口的情况,使用JDK动态代理。

创建接口实现类代理对象,增强类的方法。

在这里插入图片描述

(2)没有接口的情况,使用CGLIB动态代理。

创建子类的代理对象,增强类的方法。

在这里插入图片描述

9.简述事务的ACID特性。

ACID特性

数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

详解
1. 原子性

原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

可采用“A向B转账”这个例子来说明解释

在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。

2. 一致性

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。

保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。

3. 隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。

关于隔离性中的事务隔离等级(事务之间影响),参见相应博文

4. 持久性

这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)

write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。

10.简述SpringMVC请求处理流程,以及有哪些核心组件?

 

SpringMVC中的核心组件

DispatcherServlet:前端控制器,SpringMVC 的核心组件,用于统一处理请求和响应,并协调各个组件的工作。

HandlerMapping:处理器映射器,根据要干的活找到需要的工具(Handler),根据请求的 url、method 等信息找到合适的处理器执行链(HandlerExecutionChain),其中包含处理器(Handler)与拦截器们(interceptors)。

HandlerAdapter:处理器适配器,使用工具(Handler)干活的人,根据映射器找到的处理器信息,按照特定的规则去执行相关的处理器。因为处理器(Handler)的类型是 Object 类型,SpringMVC 无法直接执行,需要由适配器来实现处理器(Handler)的具体执行方式。

Handler:处理器,用来干活的工具,也就是由开发人员编写的 Controller,用于对用户请求进行具体的处理

ViewResolver:视图解析器,把逻辑视图解析成物理视图(其实就是把封装在 ModelAndView 中的 View 名字连接上前后缀变成具体 View 的路径,进而得到真正的 View 对象,即物理 View),并将其返回给前端控制器。

View:视图,渲染并返回视图。

11.简述你对SpringBoot的理解。

一、SpringBoot框架可以做什么:

spring boot并不是一个全新的框架,它不是spring解决方案的一个替代品,而是spring的一个封装。所以,你以前可以用spring做的事情,现在用spring boot都可以做。现在流行微服务与分布式系统,springboot就是一个非常好的微服务开发框架,你可以使用它快速的搭建起一个系统。同时,你也可以使用spring cloud(Spring Cloud是一个基于Spring Boot实现的云应用开发工具)来搭建一个分布式的网站。

二、优点:

使编码变得简单,SpringBoot采用 JavaConfig的方式,对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率。
使配置变得简单,SpringBoot提供许多默认配置,当然也提供自定义配置,但是所有的SpringBoot的项目都只有一个配置文件:application.properties/application.yml。用了SpringBoot可以不用担心配置出错找不到问题所在。
三、特点:

创立独立的Spring应用程序
嵌入的Tomcat,无需部署war文件
简化Maven配置
自动配置Spring
提供生产就绪功能,如指标,健康检查和外部配置
绝对没有代码生成和对XML没有配置要求
四、使用理解:


(1)它是Spring的升级版,Spring容器能做到的事情,它都能做到,而且更简便,从配置形式上来说,SpringBoot完全抛弃了繁琐的XML文件配置方式,而是替代性地用注解方式来实现,虽然本质来说,是差不多的(类似包扫描,注解扫描,类加载之类)。
(2)SpringBoot集成的插件更多,从而使用很多服务,都只是引入一个依赖,几个注解和Java类就可以用了,具体的参考相关手册。
(3)在Web应用开发这一块,之前的应用一般来说是打包成war包,再发布到相关服务器容器下(例如Tomcat),虽然SpringBoot也可以这么做,但在SpringBoot下更常见的形式是将SpringBoot应用打包成可执行jar包文件。之所以这么做,源于你可以直接将SpringBoot应用看成是一个Java Application,其Web应用可以没有webapp目录(更不用说web.xml了),它推荐使用html页面,并将其作为静态资源使用。

12.简述什么是 Spring Boot Stater?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,可以一站式集成 Spring和其他技术,而不需要到处找示例代码和依赖包。Spring Boot Starter的工作原理是:Spring Boot在启动时扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包,根据spring.factories配置加载AutoConfigure类,根据@Conditional注解的条件,进行自动配置并将Bean注入Spring Context

13.SpringBoot自动配置的原理。

(15条消息) SpringBoot---自动配置原理_springboot自动配置原理_Old fat.的博客-CSDN博客icon-default.png?t=N5K3https://blog.csdn.net/m0_46485178/article/details/124598527?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168775114416800184125068%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168775114416800184125068&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-124598527-null-null.142^v88^insert_down1,239^v2^insert_chatgpt&utm_term=SpringBoot%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E7%9A%84%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187

14.简述Spring Security安全框架的认证流程。

15.简述Spring Security安全框架的授权流程。

(15条消息) SpringSecurity 介绍/基本使用/加载流程/认证流程/权限访问流程/共享认证信息_springsecurity集群中怎么共享认证信息_UndefinedException的博客-CSDN博客icon-default.png?t=N5K3https://blog.csdn.net/weixin_62427168/article/details/126385617?ops_request_misc=&request_id=&biz_id=102&utm_term=%E7%AE%80%E8%BF%B0Spring%20Security%E5%AE%89%E5%85%A8%E6%A1%86%E6%9E%B6%E7%9A%84%E8%AE%A4%E8%AF%81%E6%B5%81%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-126385617.142^v88^insert_down1,239^v2^insert_chatgpt&spm=1018.2226.3001.4187

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值