spring boot 跨域方式有多种,本文采用 实现WebMvcConfigurer接口,其他方式可自行百度
步骤
1 实现WebMvcConfigurer接口,重写addCorsMappings方法
/**
* web 配置类型
*/
@Configuration
publicclassWebConfigimplementsWebMvcConfigurer{
/**
* Cors 跨域处理
*
* @param registry
*/
@Override
publicvoidaddCorsMappings(CorsRegistryregistry){
registry.addMapping("/**").allowedOrigins("*").allowedMethods("*").allowedHeaders("*").exposedHeaders(HttpHeaders.SET_COOKIE).allowCredentials(true).maxAge(1800);
}
}
一般情况下 增加这个设置基本就已经是解决了 跨域问题。 但是在用了spring security 的后,发现不好使了。
步骤二 这一步非常关键:
publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{
/**
* 主配置方法
*
* @param http
* @throws Exception
*/
@Override
protectedvoidconfigure(HttpSecurityhttp)throwsException{
// fixme: 生产环境应参照官方方式打开csrf防护
http.authorizeRequests()
.antMatchers("/rest/system/login","/swagger-ui.html/**","/webjars/**","/v2/api-docs","/swagger-resources/**").permitAll()
.antMatchers("/rest/**").hasAuthority("admin")
.anyRequest().authenticated()
.and().exceptionHandling().accessDeniedHandler(accessDeniedHandler()).authenticationEntryPoint(authenticationEntryPointHandler())
.and().cors() // 这句非常重要了
.and().formLogin().loginProcessingUrl("/rest/system/login").successHandler(authenticationSuccessHandler()).failureHandler(authenticationFailureHandler())
.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().csrf().disable();
http.addFilterBefore(authenticationTokenFilter(),UsernamePasswordAuthenticationFilter.class);
}
@Override
protectedvoidconfigure(AuthenticationManagerBuilderauth)throwsException{
auth.userDetailsService(userDetailsServiceImpl())
.passwordEncoder(passwordEncoder());
}
搞定.