当前位置: 首页 > news >正文

java spring boot 注解、接口和问题解决方法(持续更新)

注解

@RestController

        是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染

@Controller

        是Spring Framework中的注解,用于标识一个类是控制器组件。在Spring MVC(Model-View-Controller)架构中扮演重要角色,负责处理来自客户端的HTTP请求,协调业务逻辑的处理,并根据请求返回适当的视图或数据

@ResponseBody

        是Spring MVC框架中的注解,用于将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到Response对象的Body区,通常用来返回JSON或XML数据。

        @ResponseBody注解的作用是将方法的返回结果直接写入HTTP response body中,一般在异步获取数据时使用,例如AJAX。需要注意的是,如果使用了@RequestMapping注解,返回值通常会被解析为跳转路径,但加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。例如,异步获取json数据,加上@ResponseBody后,会直接返回json数据。

@RequestMapping

        是Spring框架中用于处理请求地址映射的注解,可用于类或方法上。当用于类上时,表示类中的所有响应请求的方法都是以该地址作为父路径;当用于方法上时,表示该方法处理请求的地址映射。

@RequestMapping

注解有六个属性,下面将其分成三类进行说明:

  • value:指定请求映射的URL路径。
  • method:指定请求的方法类型,如GET、POST等。
  • params:指定请求的参数,如查询参数等。
  • headers:指定请求中必须包含某些指定的header值,才能让该方法处理请求。
  • consumes:指定请求的内容类型,即消费的内容类型。
  • produces:指定响应的内容类型,即生产的内容类型。

@GetMapping和@PostMapping是Spring框架中用于处理不同HTTP请求方法的注解。

@GetMapping

        用于处理HTTP GET请求 是@RequestMapping(method = RequestMethod.GET)的缩写

@PostMapping

        用于处理HTTP POST请求。是@RequestMapping(method = RequestMethod.POST)的缩写

这两个注解的作用是将HTTP请求映射到特定的处理方法上,使得在后端代码中可以针对不同的请求进行相应的处理

@RequestParam

        如果是get请求 则使用 @RequestParam 注解直接接收参数

 @RequestBody

如果是post请求则使用 @RequestBody 注解 接收json参数

@SpringBootApplication

        是spring boot注解 标明当前是启动文件

@Mapper

        是MyBatis框架的注解,用于标识接口,这个接口定义了数据库操作的方法。

使用@Mapper注解的组件Model属性可以指定自动生成的接口实现类的组件类型,支持四种值:default、cdi、spring、jsr330。

@Data

        是Lombok中的一个注解,主要用于简化代码,提高开发效率。

        使用@Data注解可以省去代码中大量的get()、set()、toString()等方法,它会自动生成以下代码:所有字段的get和set方法、toString()方法,用于将对象转换成字符串形式,便于调试和日志输出、hashCode()方法,用于计算对象的哈希值、equals()方法,用于判断两个对象是否相等。此外,如果希望生成所有参数和指定参数的构造方法,可以使用@AllArgsConstructor或@RequiredArgsConstructor等其他Lombok注解。需要注意的是,如果在实体类中手动编写了一个带参数的构造方法,使用@Data注解会覆盖掉手动编写的构造方法

@Autowired

        可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。这里必须明确:@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier使用

@Configuration

用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Bean

是Spring框架中的注解,用于告诉Spring创建一个Bean对象,并将其放入Spring的IOC容器中管理。

使用@Bean注解可以有两种方式:

  • 用在类上 。例如@Controller、@Service、@Component、@Configuration、@Repository等注解,这些注解通常用在类上,然后通过无参构造函数创建对象并放入容器中。这种方式是由Spring自动创建对象。
  • 用在方法上 。将@Bean用在方法上,表示将该方法的返回值对象放到容器中。这种方式是由我们自己控制对象的创建。

使用@Bean注解的方法可以放在被@Controller、@Service、@Component、@Configuration、@Repository等注解的类中,这样在项目启动时,这些方法返回的对象也会被立即存入容器中。也可以直接用在启动类上。

@Component

是Spring框架中一个泛化的注解,通常是通过路径扫描来自动侦测以及自动装配到Spring容器中。

@Component注解作用于类,把普通pojo实例化到Spring容器中,相当于配置文件中的,泛指各种组件。比如当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),就可以使用@Component来标注这个类。

@Resource 

@Resource 注解是 Java EE 标准提供的注解,它用于消除代码中的硬编码,让开发人员能够轻松地将一个资源注入到代码中。它和 @Autowired 注解类似,可以自动装配 Spring 托管的 Bean,只是使用方式不同。

使用 @Resource 注解注入 Bean 时,可以指定 Bean 的名称或类型,示例如下:

@Component
public class UserServiceImpl implements UserService {@Resource(name = "userRepository")private UserRepository userRepository;...
}

在上面的示例中,我们使用 @Resource 注解将 UserRepository 类型的 Bean 注入到 UserServiceImpl 类中的 userRepository 属性中。通过指定 name 属性来指定注入的 Bean 名称,也可以通过指定 type 属性来指定 Bean 的类型。如果没有指定 name 或 type 属性,则会自动按照属性类型进行匹配。

需要注意的是,Spring 还提供了 @Inject 注解来实现依赖注入,它和 @Autowired 注解类似,但是它是 JSR-330 标准提供的注解,不是 Java EE 标准提供的,使用方式和 @Autowired 也略有不同。

@PreAuthorize 

@PreAuthorize 是 Spring Security 框架提供的一个注解,用于在方法执行前进行权限判断。它可以放置在方法上或者类上,来限制用户对这个方法或者类的访问权限。

使用 @PreAuthorize 注解需要先在 Spring Security 的配置中启用注解支持,例如:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {...
}

@PreAuthorize 注解的使用方法如下:

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void adminOnlyMethod() {...
}

上面的例子表示只有拥有 ADMIN 角色的用户才能调用 adminOnlyMethod 方法。@PreAuthorize 注解支持参数表达式,可以很灵活地进行权限校验。

需要注意的是,@PreAuthorize 注解仅起到对方法或者类的访问控制作用,需要在系统中配合其他安全措施一起使用,才能更好地保证系统的安全性。

错误

        MYBATISE 类

resultMap 下的 result jdbcType属性中没有 INT 类型会报错  No enum constant org.apache.ibatis.type.JdbcType.INT 这表明在Mapper.xml文件中可能使用了JdbcType.INT,但实际上在org.apache.ibatis.type.JdbcType中没有这个枚举值。

jdbcType有26种类型有:REAL、VARCHAR、BINARY、BIT、FLOAT、CHAR、TIMESTAMP、OTHER、UNDEFINED、TINYINT、BLOB、NVARCHAR、SMALLINT、DOUBLE、DECIMAL、TIME、NULL、CURSOR、LONGVARCHAR、VARBINARY、CLOB、NCHAR、INTEGER、NUMERIC、DATE、LONGVARBINARY、BOOLEAN、NCLOB、BIGINT1。

程序类

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exc

        问题是一个常见的Java NPE(空指针异常)。在Spring MVC框架中,当dispatcherServlet处理请求时,如果遇到空指针异常,就会出现这样的错误消息。

空指针异常可能由以下几种原因引起:

  1. 你在控制器的方法参数中使用了某个对象,但请求处理该方法时,该对象为空。
  2. 你的控制器返回的对象为空。
  3. 查询出来的数据是null就是没有数据。
  4. 或者是使用其他包的对象缺少注解 @Autowired

spring boot

        HandlerInterceptor拦截器

        在spring boot中 无论是filter 过滤器还是interceptor 拦截器都是无法使用自动注入获取属性的,无论是在拦截器类中注入还是在new的实例中有自动注入的属性都会报空值异常,无法找到类;想在拦截器中使用自定义类或者其他ioc容器中的bean,可以在InterceptorConfiguration构建Interceptor时中填入属性值,因为在配置类中是可以使用自动注入的

示例:

        

这样即可 使用自定义类或者其他ioc容器中的bean

注意内容 

数据类型

long

long 长整型需要在 值后面加一个L 默认是通过int 整型隐式转换成 long 长整型 如果没有L 说明他是int 如果数值大于 int的最大字符就会报错

float

float 单精度浮点型 需要在值后面加一个F 默认是双精度浮点数 double 而双精度浮点类型 大于 float单精度浮点类型 不能进行转换所以 会报错

List

ArrayList   

如果整型数据需要根据内容进行删除 则需要 new  Integer(删除内容值) 已这种显示的形式删除

package com.example.demo.common;import java.util.ArrayList;
import java.util.List;public class Common {protected Common(){List auth = new ArrayList();
//        添加数据auth.add("name");auth.add(1);auth.add(2);auth.add(3);auth.add(4);System.out.println("add:"+auth);
//        更新数据 通过索引进行更新auth.set(0,5);System.out.println("set:"+auth);List auth1 = new ArrayList<>();auth1.add("www");auth1.add("com");auth1.add("cc");auth1.add("cn");
//      将其他集合所有内容 添加到当前内容auth.addAll(auth1);System.out.println("addAll:"+auth);
//       根据所有删除指定数据auth.remove(0);System.out.println("remove:"+auth);
//        根据内容删除指定数据auth.remove("www");System.out.println("remove:"+auth);
//        删除内容为4的数据  因为现在删除数据是默认根据索引进行删除 如果整型数据需要根据内容进行删除 则需要 new  Integer(删除内容值) 已这种显示的形式删除auth.remove(4);System.out.println("remove:"+auth);auth.remove(new Integer(4));System.out.println("remove:"+auth);
//        根据查询的内容返回第一次出现的数据对应索引下标 如果找不到返回 -1System.out.println("indexOf:"+auth.indexOf("cc"));
//      清空指定集合的内容auth.removeAll(auth1);System.out.println("removeAll:"+auth);
//      判断集合是否为空System.out.println("isEmpty:"+auth.isEmpty());
//        获取当前集合的数据数量System.out.println("size:"+auth.size());List auth2 = new ArrayList<>();auth2.add(1);auth2.add(2);
//      判断当前集合是否包含另一个集合的全部内容System.out.println("containsAll:"+auth.containsAll(auth2));
//        判断当前集合是否 包含某个值System.out.println("contains:"+auth.contains(1));
//        replaceAll方法用于替换列表中所有满足某个条件的元素
//        这个方法接受一个UnaryOperator<E>作为参数,这是一个函数接口,它接受列表中的每个元素,并返回一个新的元素来替换原来的元素。
//        这个例子中,replaceAll方法接受一个lambda表达式 s -> s.equals(1) 作为参数。这个lambda表达式对列表中的每个元素执行,将每个字符串进行判断是否等于1,如果等于1则替换成true否则falseauth.replaceAll(s->s.equals(1));System.out.println("replaceAll:"+auth);
//        清空数据auth.clear();System.out.println("clear:"+auth);
//      判断集合是否为空System.out.println("isEmpty:"+auth.isEmpty());}}

接口

OncePerRequestFilter过滤器接口  

OncePerRequestFilter 是 Spring 框架提供的过滤器抽象类,用于在请求处理之前或之后执行一些通用的处理逻辑,常见的应用场景包括:

  • 鉴权,判断用户是否有权限访问资源
  • 全局异常处理
  • 统一添加响应头等

OncePerRequestFilter 实现了 javax.servlet.Filter 接口,并在内部实现了doFilter()方法,封装了具体的 Filter 处理流程,保证每个 Request 只执行一次。我们只需要在派生类中实现doFilterInternal() 方法即可,该方法的参数是 HttpServletRequest 和 HttpServletResponse 对象。例如:

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {@Autowiredprivate JwtTokenProvider jwtTokenProvider;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 从请求头中获取 Jwt TokenString token = jwtTokenProvider.resolveToken(request);// 验证 Jwt Token,并从中获取用户信息if (StringUtils.hasText(token) && jwtTokenProvider.validateToken(token)) {Authentication authentication = jwtTokenProvider.getAuthentication(token);SecurityContextHolder.getContext().setAuthentication(authentication);}// 继续处理请求filterChain.doFilter(request, response);}
}

在上面的代码中,我们实现了一个 JwtAuthenticationFilter 过滤器,用于从请求头中提取 JWT Token,并校验和解析 Token,将用户信息存储到 Spring Security 上下文中。这样在后续处理请求时,就可以通过 SecurityContextHolder 获取到用户信息。然后,我们将该过滤器定义为 Spring Bean,以便在 WebSecurityConfig 中进行配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate JwtAuthenticationFilter jwtAuthenticationFilter;@Overrideprotected void configure(HttpSecurity http) throws Exception {http// ....addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);}
}

在上面的代码中,我们使用 addFilterBefore() 方法将 JwtAuthenticationFilter 过滤器添加到 UsernamePasswordAuthenticationFilter 过滤器之前,这样就能够保证在 UsernamePasswordAuthenticationFilter 过滤器中对用户进行身份认证之前,先执行 JwtAuthenticationFilter 过滤器中的逻辑。

HandlerInterceptor拦截器

 是 Spring 框架提供的拦截器接口,可用于在请求处理之前或之后执行一些通用的处理逻辑,例如:

  • 认证用户请求的权限
  • 记录请求日志
  • 统计请求时长等

HandlerInterceptor 接口有三个方法:

  1. preHandle():在请求处理之前执行。可以用来进行拦截请求等操作。
  2. postHandle():在请求处理之后执行。可以用来进行处理请求结果等操作。
  3. afterCompletion():在完成请求处理之后执行。用于清理资源等操作。

在 SpringMVC 的配置文件中,可以通过 addInterceptor() 方法注册一个 HandlerInterceptor 拦截器,并指定要拦截的 URL。例如:

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {@Autowiredprivate LogInterceptor logInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(logInterceptor).addPathPatterns("/**");}
}

在上面的代码中,我们定义了一个 LogInterceptor 拦截器,并注册到 InterceptorRegistry 中,然后使用 addPathPatterns() 方法指定要拦截的 URL(这里是所有 URL)。从而实现了在所有请求之前和之后均执行 LogInterceptor 中的业务逻辑。

WebMvcConfigurer配置接口

WebMvcConfigurer 是 Spring MVC 框架提供的一个配置接口,用于扩展和自定义 Spring MVC 的功能。通过实现 WebMvcConfigurer 接口,我们可以进行一些常见的配置操作,例如:

  • 添加拦截器
  • 修改视图解析器
  • 自定义消息转换器等

当我们需要通过自定义配置来对 Spring MVC 进行特定的操作时,就可以实现 WebMvcConfigurer 接口,并在其中实现相应的方法。例如:

@Configuration
public class MvcConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/login");}@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {registry.jsp("/WEB-INF/views/", ".jsp");}@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MappingJackson2HttpMessageConverter());}
}

在上面的代码中,我们实现了一个 MvcConfig 类,并实现了 WebMvcConfigurer 接口中的几个方法。其中,addInterceptors() 方法用于添加拦截器,configureViewResolvers() 方法用于修改视图解析器,configureMessageConverters() 方法用于添加自定义的消息转换器。这样,就可以通过 MvcConfig 类来配置 Spring MVC 的相关功能。

需要注意的是,当我们实现 WebMvcConfigurer 接口时,可以只重写需要自定义的方法,而不需要全部重写。并且,在 Spring Boot 中,只需要将 WebMvcConfigurer 的实现类定义为 Spring Bean 即可,Spring Boot 会自动将其加入 Spring MVC 配置中。

Spring Security

WebSecurityConfigurerAdapter  Security 配置适配器

WebSecurityConfigurerAdapter 是一个方便地帮助用户进行自定义 Security 配置的适配器。在使用Spring Security进行Web应用程序的安全保护时,通常需要创建一个自定义的 WebSecurityConfigurerAdapter 类。

WebSecurityConfigurerAdapter 类提供了 configure 方法,通过重写该方法可以对 Spring Security 进行配置。在这里可以配置 Spring Security 相关的东西,包括如登录页面、登录请求处理、权限控制等等。

在一个 WebSecurityConfigurerAdapter 子类中可以使用各种各样的方法去配置 Spring Security,下面是一些常用的方法:

  1. configure(HttpSecurity http):该方法用于配置 HTTP 请求安全处理。在这个方法中可以设置登录页面、登录请求处理、权限控制等;

  2. configure(WebSecurity web):该方法用于配置 Filter 链,可以设置忽略某些 URL 不走 Spring Security 验证;

  3. configure(AuthenticationManagerBuilder auth):该方法用于配置用户凭证存储和认证方式。

下面是一个简单的示例代码,展示了 WebSecurityConfigurerAdapter 的基本用法:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate MyUserDetailService userDetailsService;@Autowiredprivate MyPasswordEncoder passwordEncoder;@Overrideprotected void configure(HttpSecurity http) throws Exception {//定义访问权限http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/**").permitAll().and()//登录相关配置.formLogin().loginPage("/login").defaultSuccessUrl("/index").failureUrl("/login/error").and()//注销相关配置.logout().logoutUrl("/logout").logoutSuccessUrl("/").and()//开启记住我功能.rememberMe().rememberMeParameter("remember-me").tokenValiditySeconds(86400);}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//设置认证方式auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);}@Overridepublic void configure(WebSecurity web) throws Exception {//设置忽略静态资源web.ignoring().antMatchers("/css/**", "/js/**", "/images/**");}
}

在该示例代码中,我们继承 WebSecurityConfigurerAdapter 并重写了几个关键的方法。configure(HttpSecurity http) 用于定义访问权限、登录相关配置,注销相关配置以及开启记住我功能。configure(AuthenticationManagerBuilder auth) 用于设置认证方式。configure(WebSecurity web) 用于设置忽略静态资源。

AuthenticationEntryPoint 接口

配置WebSecurityConfigurerAdapter  Security 适配器

在 Spring Security 中,AuthenticationEntryPoint 接口表示在用户请求需要认证的资源时,Spring Security 将会调用其实现类的 commence 方法,该方法将决定如何处理未授权用户的请求。被ExceptionTranslationFilter用来作为认证方案的入口,即当用户请求处理过程中遇见认证异常时,被异常处理器(ExceptionTranslationFilter)用来开启特定的认证流程

如果用户请求需要认证的资源但未通过身份验证,将抛出一个 AuthenticationException 异常。默认情况下,Spring Security 将会重定向到登录页面以便用户登录。然而,如果你想要其他的表现形式,如直接返回错误信息或者进行其他的重定向等,就可以实现 AuthenticationEntryPoint 接口并重写其中的 commence 方法。

commence 方法的签名如下:

void commence(HttpServletRequest request, HttpServletResponse response,AuthenticationException authException)

方法中的 request 表示用户发送的请求,response 表示响应结果,authException 表示抛出的 AuthenticationException 异常。

因为 AuthenticationEntryPoint 可以定制化未授权用户的请求响应信息,所以在 Spring Security 中是非常重要的一个接口。比如可以在该方法中返回未授权的错误信息、跳转到其他网页等。同时也可以通过实现该接口自定义登录页面,如下示例:

public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response,AuthenticationException authException) throws IOException, ServletException {//设置响应状态码,代表用户没有授权response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);response.setContentType(MediaType.TEXT_PLAIN_VALUE);//返回信息response.getWriter().write("您还没有登录,请先登录!");//跳转到登录页面//response.sendRedirect("/login");}
}

在该实现类中,如果用户请求未经认证的资源,返回响应状态码为 401(请求未授权),同时返回一个文本信息 "您还没有登录,请先登录!"。如果需要跳转到登录页面可以将响应流程改为注释掉的一行代码。

 LogoutSuccessHandler 接口

配置WebSecurityConfigurerAdapter  Security 适配器

在 Spring Security 中,LogoutSuccessHandler 接口用于处理用户注销成功后的逻辑。当用户成功注销时,Spring Security 将调用 LogoutSuccessHandler 的实现类,并调用其中的 onLogoutSuccess 方法来处理注销成功的逻辑。

在实现自定义的 LogoutSuccessHandler 时,需要实现以下 onLogoutSuccess 方法:

public interface LogoutSuccessHandler {void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,Authentication authentication) throws IOException, ServletException;
}

在方法中,request 表示用户发送的注销请求,response 表示注销响应结果,authentication 表示用户的认证信息。authentication 可以获取用户注销之前的认证信息,如用户对象、用户权限等。

下面是一个示例代码,展示如何实现 LogoutSuccessHandler 接口:

public class MyLogoutSuccessHandler implements LogoutSuccessHandler {@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,Authentication authentication) throws IOException, ServletException {//获取用户信息UserDetails userDetails = (UserDetails)authentication.getPrincipal();String username = userDetails.getUsername();//记录退出日志//log.info("User {} logout success.", username);//跳转到主页面response.sendRedirect("/");}
}

在该示例代码中,我们实现了一个简单的 LogoutSuccessHandler,通过重写 onLogoutSuccess 方法实现了退出日志记录和跳转到主页面的逻辑。

在配置 Spring Security 的过程中,可以通过调用 logoutSuccessHandler 方法来设置注销成功后的处理逻辑,如下示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate MyUserDetailService userDetailsService;@Autowiredprivate MyPasswordEncoder passwordEncoder;@Autowiredprivate MyLogoutSuccessHandler logoutSuccessHandler;@Overrideprotected void configure(HttpSecurity http) throws Exception {//定义访问权限http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/**").permitAll().and()//登录相关配置.formLogin().loginPage("/login").defaultSuccessUrl("/index").failureUrl("/login/error").and()//注销相关配置.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler).and()//开启记住我功能.rememberMe().rememberMeParameter("remember-me").tokenValiditySeconds(86400);}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {//设置认证方式auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);}@Overridepublic void configure(WebSecurity web) throws Exception {//设置忽略静态资源web.ignoring().antMatchers("/css/**", "/js/**", "/images/**");}
}

以上示例代码中,我们在 configure(HttpSecurity http) 方法中设置了 .logoutSuccessHandler(logoutSuccessHandler) ,将我们自己编写的 MyLogoutSuccessHandler 设置为注销成功的处理类。

AuthenticationManager   身份认证管理器

AuthenticationManager 是 Spring Security 框架提供的身份认证管理器,用于管理认证对象的验证和授权。它处理 Authentication 类型的对象,也就是待验证的身份信息。

AuthenticationManager 接口定义了一个方法 authenticate(),该方法用于验证并返回一个经过身份验证的 Authentication 对象。身份验证过程分为两个步骤:

  1. 首先根据用户输入构造一个 Authentication 对象;
  2. 然后通过 authenticate() 方法对其进行验证。

当身份验证成功时,authenticate() 方法将返回一个身份验证信息 Authentication 对象,并将其传递给 Spring Security 框架。这个对象包含了用户基本信息、用户的权限信息等。

AuthenticationManager 接口提供了多个实现类,包括 ProviderManager、DaoAuthenticationProvider 和 RemoteAuthenticationProvider 等。开发者也可以自己实现 AuthenticationManager 接口,以满足自己的特定需求。

在 Spring Security 中,用户验证信息、授权信息和其他相关配置信息都存储在 Authentication 对象中,AuthenticationManager 就是用来管理这些 Authentication 对象的验证和授权过程的。

在 Spring Security 中,authenticationManager.authenticate 方法在验证身份信息时,需要调用 UserDetailsService 的 loadUserByUsername 方法获取用户的基本信息和权限等信息。这是因为在 Spring Security 中,身份验证的过程需要使用到用户的基本信息和权限等数据,而用户的基本信息和权限等数据存储在数据库或其他数据源中,需要通过 loadUserByUsername 方法获取。

在默认情况下,使用的是 DaoAuthenticationProvider 提供的身份验证服务。DaoAuthenticationProvider 内部包含了一个 UserDetailsService 对象,会在身份验证时自动调用该对象的 loadUserByUsername 方法从数据库中获取用户信息。在 authenticate() 方法中,会通过 Authentication 对象的 getPrincipal() 方法获取用户名,然后将其传入 UserDetailsService 的 loadUserByUsername 方法中进行验证。

如果你使用自定义的身份验证服务,那么你需要自己实现 AuthenticationManager 和 UserDetailsService 接口,从而实现身份验证和用户信息获取逻辑。

相关文章:

java spring boot 注解、接口和问题解决方法(持续更新)

注解 RestController 是SpringMVC框架中的一个注解&#xff0c;它结合了Controller和ResponseBody两个注解的功能&#xff0c;用于标记一个类或者方法&#xff0c;表示该类或方法用于处理HTTP请求&#xff0c;并将响应的结果直接返回给客户端&#xff0c;而不需要进行视图渲染…...

HMAC_SHA1加密算法和SHA1加密算法的区别

HMAC_SHA1加密算法和SHA1加密算法的区别 应用场景&#xff1a;SHA1目前主要用于政府部门和私营业主处理敏感信息&#xff0c;被视为最先进的加密技术。而HMAC_SHA1主要用于基于密钥的消息认证码&#xff08;HMAC&#xff09;运算&#xff0c;需要一个密钥作为输入。密钥需求&a…...

Ubuntu连不上WiFi 或者虽然能连上校园网,但是浏览器打不开登录页面

写在前面 自己的电脑环境&#xff1a; Ubuntu20.04 一、问题描述 自己的 Ubuntu 遇到连接不上 除校园网之外的其他WiFi, 或者 虽然能连上校园网&#xff0c;但是浏览器打不开登录页面的问题。 二、解决方法 出现这种问题的原因可能是 之前开过VPN, 导致系统的网络设置出现…...

Maven第八章:如何解决Maven的jar版本冲突

Maven第八章:如何解决Maven的jar版本冲突 前言 本文重点讲解Maven依赖冲突原因,maven依赖原则以及如何利用idea Maven Helper插件分析解决问题。 背景 开发过程中引入第三方jar遇到依赖冲突的,非常影响开发,甚至大部分时间都在调试版本兼容。 Caused by:java.lang.NoSuch…...

c# 读写内存映射文件

在C#中&#xff0c;可以使用System.IO.MemoryMappedFiles命名空间中的MemoryMappedFile类来操作内存映射文件。可以创建不固定大小的内存映射文件&#xff0c;具体步骤如下&#xff1a; 1. 先创建一个初始大小为0的内存映射文件&#xff0c;使用MemoryMappedFile.CreateNew方法…...

行业揭秘:腾讯共享wifi码推广零加盟费是真的吗?

近年来&#xff0c;“共享经济”概念在商业领域取得了巨大成功。共享WiFi贴码成为共享经济的一种典型案例&#xff0c;被越来越多的人看作是一种低风险、高回报的投资方式。而在这个市场中&#xff0c;腾讯WiFi码推广以“零加盟费”而备受关注。本文将探讨腾讯WiFi码推广零加盟…...

E4980A 精密型 LCR 表,20 Hz 至 2 MHz

E4980A 精密型 LCR 表 20 Hz 至 2 MHz E4980A 精密型 LCR 表实现了测量准确度、速度与通用性的理想结合&#xff0c;适用于各种元器件测量。 E4980A 精密型 LCR 表实现了测量准确度、速度与通用性的理想结合&#xff0c;适用于各种元器件测量。 无论是在低阻抗量程还是在高阻…...

【前端工作提效】关于工作提效的一点实践与思考

1、测试提的BUG是一个一个提的&#xff0c;如果顺着测试提供的BUG单去一个一个解决问题&#xff0c;那么很容易管中窥豹&#xff0c;就像打补丁一样&#xff0c;缝缝补补&#xff0c;没有办法从根源去解决问题。所以我们需要尽量去了解代码的业务情况&#xff0c;并尽可能将一些…...

Pytorch 文本情感分类案例

一共六个脚本,分别是: ①generateDictionary.py用于生成词典 ②datasets.py定义了数据集加载的方法 ③models.py定义了网络模型 ④configs.py配置一些参数 ⑤run_train.py训练模型 ⑥run_test.py测试模型 数据集https://download.csdn.net/download/Victor_Li_/88486959?spm1…...

Flutter之GetX controller tag使用详解

本文主要介绍 GetX 依赖注入中 tag 的作用和使用详解。 作用 前面几篇文章介绍了 GetX 依赖注入的使用以及通过源码剖析了依赖注入的原理&#xff1a; •《Flutter应用框架搭建(一)GetX集成及使用详解》•《Flutter 通过源码一步一步剖析 Getx 依赖管理的实现》•《Flutter之…...

Kubernetes群集调度

调度约束 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 Node 节点上面建立 Pod 和 Container。 APIServ…...

【总结】linux centos 7 开启网络白名单访问策略

目录 linux开启网络端口白名单访问策略开启白名单步骤补充说明 linux开启网络端口白名单访问策略 安全需要&#xff0c;被检测各种3306、9200、9300端口没有设置访问策略。需要整改。 对于linux来说&#xff0c;有两种方式可以开启防火墙 开启白名单步骤 场景一&#xff1a…...

2023-2024-1高级语言程序设计第1次月考

7-1-1 计算摄氏温度 给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius C”输出对…...

目标检测:Proposal-Contrastive Pretraining for Object Detection from Fewer Data

论文作者&#xff1a;Quentin Bouniot,Romaric Audigier,Anglique Loesch,Amaury Habrard 作者单位&#xff1a;Universit Paris-Saclay; Universit Jean Monnet Saint-Etienne; Universitaire de France (IUF) 论文链接&#xff1a;http://arxiv.org/abs/2310.16835v1 内容…...

Cesium:CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再转换到笛卡尔坐标系的xyz坐标

作者:CSDN @ _乐多_ 本文将介绍使用 Vue 、cesium、proj4 框架,实现将CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再将WGS84坐标系的经纬高度转换到笛卡尔坐标系的xyz坐标的代码。并将输入和输出使用 Vue 前端框架展示了出来。代码即插即用。 网页效果如下图所示…...

【OpenCV实现图像:用Python生成图像特效,报错ValueError: too many values to unpack (expected 3)】

文章目录 概要读入图像改变单个通道黑白特效颜色反转将图像拆分成四个子部分 概要 Python是一种功能强大的编程语言&#xff0c;也是图像处理领域中常用的工具之一。通过使用Python的图像处理库&#xff08;例如Pillow、OpenCV等&#xff09;&#xff0c;开发者可以实现各种各…...

875. 爱吃香蕉的珂珂

题目描述 珂珂喜欢吃香蕉。这里有 n 堆香蕉&#xff0c;第 i 堆中有 piles[i] 根香蕉。警卫已经离开了&#xff0c;将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k &#xff08;单位&#xff1a;根/小时&#xff09;。每个小时&#xff0c;她将会选择一堆香蕉&#xff0c…...

台灯太亮会导致近视吗?精选高品质的台灯

台灯相信很多家庭都会备上一台&#xff0c;用于办公、休闲或者给孩子学习使用&#xff0c;如果使用的台灯亮度过高的话&#xff0c;可能会对视力造成一定的影响&#xff0c;尤其是夜晚的时候。建议是选择带有亮度调节功能的台灯会比较好一点&#xff0c;可以自行根据周围环境的…...

Scala函数和闭包

1. 函数 1.1 函数与方法 Scala 中函数与方法的区别非常小&#xff0c;如果函数作为某个对象的成员&#xff0c;这样的函数被称为方法&#xff0c;否则就是一个正常的函数。 // 定义方法 def multi1(x:Int) {x * x} // 定义函数 val multi2 (x: Int) > {x * x}println(mult…...

LeetCode----1935. 可以输入的最大单词数

题目 键盘出现了一些故障,有些字母键无法正常工作。而键盘上所有其他键都能够正常工作。 给你一个由若干单词组成的字符串 text ,单词间由单个空格组成(不含前导和尾随空格);另有一个字符串 brokenLetters ,由所有已损坏的不同字母键组成,返回你可以使用此键盘完全输入…...

学习笔记三十:K8S配置管理中心Secret实现加密数据配置管理

K8S配置管理中心Secret实现加密数据配置管理 Secret概述secret三种可选参数:Secret类型 使用Secret通过环境变量引入Secret通过volume挂载Secret创建Secret创建yaml文件将Secret挂载到Volume中 Secret概述 Configmap一般是用来存放明文数据的&#xff0c;如配置文件&#xff0…...

关于uviewui修改主题及在uniapp中的应用

在uview使用过程中遇到很多不方便的地方&#xff0c;记录下来 修改主题颜色 给UI框架换个主题色基础方法是覆盖原有色&#xff08;但这个方法比较笨&#xff0c;处理起来也不干净利索&#xff09;&#xff0c;所以换个思路改变基础色值变量&#xff0c;步骤主要分为2部分&…...

使用QEMU模拟启动uboot

uboot的相关知识&#xff0c;可以参考&#xff1a;uboot基本概念。 一、环境配置 WSL: ubutu20.04 模拟开发板&#xff1a;vexpress-a9 uboot版本&#xff1a;u-boot-2023.10 二、安装QEMU 2.1、安装sudo apt install qemu2.2、查看支持哪些开发板qemu-system-arm -M help结…...

学习数据结构和算法之前,你需要知道什么?

最快的学习方法是什么&#xff1f;计算机基础支持有哪些&#xff1f;学习数据结构和算法应该如何思考&#xff1f;如何成长&#xff1f;为什么要学习数据结构和算法&#xff1f; 最快的学习方法是什么&#xff1f; 实践。 计算机基础支持有哪些&#xff1f; 数据结构和算法。…...

16. 机器学习 - 决策树

Hi&#xff0c;你好。我是茶桁。 在上一节课讲SVM之后&#xff0c;再给大家将一个新的分类模型「决策树」。我们直接开始正题。 决策树 我们从一个例子开始&#xff0c;来看下面这张图&#xff1a; 假设我们的x1 ~ x4是特征&#xff0c;y是最终的决定&#xff0c;打比方说是…...

将多余的内存,当作虚拟内存。修改edge缓存路径到虚拟内存中

一、下载工具&#xff0c;把内存映射成硬盘 软媒内存盘 v1.1.3.0 软媒内存盘下载-软媒内存盘 v1.1.3.0 - 下载吧 (xiazaiba.com) 二、映射edge的缓存路径 到新建的虚拟硬盘中 mklink /D "C:\Users\Administrator\AppData\Local\Microsoft\Edge\User Data" "V:\…...

【从0到1设计一个网关】过滤器链的实现---实现负载均衡过滤器

文章目录 什么是过滤器?编写负载均衡过滤器负载均衡的定义与实现负载均衡算法设计实现效果演示链接 自研网关整合Nacos,实现服务注册和配置变更 源码链接 什么是过滤器? 再前面的几个章节中我们已经实现了将我们的网关服务注册到注册中心,并且成功的从配置中心拉取了配置…...

科技云报道:打造生成式AI应用,什么才是关键?

科技云报道原创。 生成式AI作为当前人工智能的前沿领域&#xff0c;全球多家科技企业都在加大生成式AI的研发投入力度。 随着技术、产品及应用等方面不断推出重要成果&#xff0c;如今有更多的行业用户在思考该如何将生成式AI应用落地。 但开发生成式AI应用是一个充满挑战的…...

可回馈式电子负载的工作原理

可回馈式电子负载是一种用于模拟负载并测试电源或电子设备性能的工具。其工作原理如下&#xff1a; 控制回路&#xff1a;可回馈式电子负载内部有一个控制回路&#xff0c;用于监测和控制负载的电流、电压和功率等参数。这个控制回路可以根据用户设定的参数&#xff0c;自动调整…...

基于Vite使用VitePress搭建静态站点博客

使用VitePress搭建静态站点博客 官方文档什么是VitePress&#xff1f;一、初始化项目1.安装依赖包VitePress可以单独使用&#xff0c;也可以安装到现有的项目中。在这两种情况下&#xff0c;您都可以安装它: (也可以全局安装&#xff0c;建议&#xff1a;当前项目内安装) 2.初始…...