实现跨域访问
虽然原理比较复杂,但是:
- 浏览器端都由浏览器自动完成,我们无需操心
- 服务端可以通过拦截器统一实现,不必每次都去进行跨域判定的编写。
事实上,SpringMVC已经帮我们写好了CORS的跨域过滤器:CorsFilter ,内部已经实现了刚才所讲的判定逻辑,我们直接用就好了。
ps:
如果是微服务可以直接在gateway中创建配置文件
1).编写application.yaml文件:
ly:
cors:
allowedOrigins: #允许的域,不要写*,否则cookie就无法使用了
- http://www.leyou.com
- http://manage.leyou.com
allowCredentials: true #是否发送Cookie信息
allowedMethods: #允许的请求方式
- DELETE
- OPTIONS
- HEAD
- GET
- POST
- PUT
allowedHeaders: #允许的头信息
- "*"
maxAge: 3600000 #有效期(毫秒)
filterPath: "/**" #添加映射路径,我们拦截一切请求
2).配置文件加载类:
package com.leyou.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
/**
* 配置文件加载类
*/
@Data
@ConfigurationProperties(prefix = "ly.cors") // 这注解必须要有类打上@EnableConfigurationProperties(CORSProperties.class)这个注解才能生效
public class CORSProperties {
private List<String> allowedOrigins;
private Boolean allowedCredentials;
private List<String> allowedMethods;
private List<String> allowedHeaders;
private Long maxAge;
private String filterPath;
}
3).编写一个配置类,并且注册CorsFilter:
package com.leyou.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
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;
/**
* 全局CORS配置文件
*/
@Configuration
@EnableConfigurationProperties(CORSProperties.class) // 让使用 @ConfigurationProperties 注解的类生效。
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter(CORSProperties prop) {
// 1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
// 1) 允许的域,不要写*,否则cookie就无法使用了
prop.getAllowedOrigins().forEach(config::addAllowedOrigin);
// 2) 是否发送Cookie信息
config.setAllowCredentials(prop.getAllowedCredentials());
// 3) 允许的请求方式
prop.getAllowedMethods().forEach(config::addAllowedMethod);
// 4)允许的头信息
prop.getAllowedHeaders().forEach(config::addAllowedHeader);
// 5)有效期
config.setMaxAge(prop.getMaxAge());
//2.添加映射路径,我们拦截一切请求
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration(prop.getFilterPath(),config);
//3.返回新的CORSFilter.
return new CorsFilter(source);
}
}