SpringBoot相关
Table of Contents generated with DocToc (opens new window)
- springboot项目中在拦截器里使用redis获取值,一直爆空指针错误:
- springboot整合mybatis-plus时,同时导入mybatis-generator包,会出现冲突,导致serviceBean扫描不到
- Spring Boot 使用WebMvcConfigurer配置拦截器导致跨域配置失效问题
# springboot项目中在拦截器里使用redis获取值,一直爆空指针错误:
注意
拦截器在SpringContext初始化之前就执行了,Bean初始化之前它就执行了,所以它肯定是无法获取SpringIOC容器中的内容的。那么我们就让拦截器执行的时候实例化拦截器Bean,在拦截器配置类里面先实例化拦截器,然后再获取就能解决这个问题。
/**
* @author zdk
* @date 2021/7/6 19:16
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加视图控制器
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("login");
}
/**
* 提前实例化拦截器
* @return
*/
@Bean
public LoginHandlerInterceptor getLoginHandlerInterceptor(){
return new LoginHandlerInterceptor();
}
/**
* 添加拦截器时使用getLoginHandlerInterceptor获取已实例化的拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLoginHandlerInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/login.html","/","/user/userLogin","/user/toLogin")
.excludePathPatterns("/**/*.html", "/**/*.js", "/**/*.css", "/**/*.json", "/**/*.icon","/**/*.jpg","/**/*.png");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# springboot整合mybatis-plus时,同时导入mybatis-generator包,会出现冲突,导致serviceBean扫描不到
# Spring Boot 使用WebMvcConfigurer配置拦截器导致跨域配置失效问题
使用自定义拦截器时跨域相关配置会失效 原因是请求经过的先后顺序问题,当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。
解决方法:使用CorsFilter过滤器配合
在实现WebMvcConfigurer接口配置类中加入下面代码
private CorsConfiguration addcorsConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); List<String> list = new ArrayList<>(); list.add("*"); corsConfiguration.setAllowedOrigins(list); /* // 请求常用的三种配置,*代表允许所有,当时你也可以自定义属性(比如header只能带什么,只能是post方式等等) */ corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", addcorsConfig()); return new CorsFilter(source); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
最终代码是:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedOrigins("http://localhost:8080")
.allowCredentials(true)
.allowedMethods(CorsConfiguration.ALL)
.maxAge(3600);
//一小时内不用再预先检测(发送OPTIONS请求)
}
@Autowired
private PermissionInterceptor permissionInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(permissionInterceptor)
.excludePathPatterns("/user/login","/user/register")
.excludePathPatterns("/menus","/verificationCode")
.excludePathPatterns("/swagger*/**", "/v2/**", "/webjars/**");
}
private CorsConfiguration addcorsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
List<String> list = new ArrayList<>();
list.add("*");
corsConfiguration.setAllowedOrigins(list);
/*
// 请求常用的三种配置,*代表允许所有,当时你也可以自定义属性(比如header只能带什么,只能是post方式等等)
*/
corsConfiguration.addAllowedOrigin("http://localhost:8080");
// corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", addcorsConfig());
return new CorsFilter(source);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
在 GitHub 上编辑此页 (opens new window)
最后更新: 2022/10/04, 16:10:00