第11章 Spring Security 跨域

什么是跨域

在了解跨域之前,我们先来了解以下同域。同域:协议、域名、端口都相同;否则就是跨域。例如在域名 aa.com 下发起一个资源访问 aa.com/books/info 的Ajax 请求,这个请求是被允许的。因为它是同域访问。如果在域名 aa.com 下发起一个资源访问 bb.com/books/info 的Ajax请求,这个请求就是跨域访问。一般情况下,跨域访问都会报错。

Spring 解决办法

@CrossOrigin

第一种办法就是使用 @CrossOrigin 注解,可以在@RestController的class级别或方法级别定义一个@CrossOrigin,例如:

// 表示允许主机localhost:8899访问这个服务,假设这个服务在localhost:8080
@CrossOrigin(origins = "http://localhost:8099")
@RestController
@RequestMapping("/api")
public class ApiController {
    ...
}
CorsRegistry

第二种方法是在 WebMvcConfigurer 中定义一个全局CORS配置。

@Bean
WebMvcConfigurer createWebMvcConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/api/**")
                    .allowedOrigins("http://local.liaoxuefeng.com:8080")
                    .allowedMethods("GET", "POST")
                    .maxAge(3600);
            // 可以继续添加其他URL规则:
            // registry.addMapping("/rest/v2/**")...
        }
    };
}

Spring Security 解决办法

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .httpBasic()
        .and()
        .cors().configurationSource(corsConfigurationSource())
        .and()
        .csrf().disable();
    http.addFilterBefore(new MyFilter(), UsernamePasswordAuthenticationFilter.class);
}

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("http://localhost:8011"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}
上一篇:centos绑定多个域名


下一篇:改变您的HTTP服务器的缺省banner