解决这种跨域问题可以通过增加过滤器来实现,为啥说可以呢,因为我也不清楚有没有其他方式可以实现。我实践了几次都是可行的,但是有一些原理我还是不清楚在文末提了一下。欢迎明白的朋友跟我指点一下。
- 配置过滤器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class GlobalCorsConfiguration {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOrigin(CorsConfiguration.ALL);
corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
- 处理options请求
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@Order(-1)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatchers()
.antMatchers(HttpMethod.OPTIONS)
.and()
.cors();
}
}
注:至于第二步为啥要处理options请求,是因为如果发出的是非简单请求
的话,浏览器会先发送一个options请求来试探一下,所以需要处理一下这个options请求,要不然请求是不会真正发送的。具体可以看这个老司机的文章
一般来说,这两板斧一耍完,跨域就解决了。
抛出问题
- 问题1:
http.requestMatchers()
.antMatchers(HttpMethod.OPTIONS)
.and()
.cors();
这段代码写了antMatchers
之后直接就and
了,没有任何权限表达式,像permitAll
之类的,这种写是什么意思?
- 问题2
处理options的配置我在资源认证服务器
上面写不起作用,非得要新建WebSecurityConfig
写在这里才可以。这里我想问的是,WebSecurityConfig
里面的配置和资源认证服务器
里面的配置有什么区别?
网友评论