跨域问题解决
跨域的情况
- ip地址不同,域名相同(跨域)
- ip地址相同,域名不同(跨域)
- ip地址不同,域名不同(跨域)
方式一:添加自定义配置类
添加配置类,配置跨域
@Configuration
public class CrosConfig {
/**
* 跨域
* @return
*/
private CorsConfiguration corsConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setMaxAge(3600L);
return corsConfiguration;
}
/**
* 设置所有路径都跨域
* @return
*/
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", corsConfig());
return new CorsFilter(source);
}
}
方式二:添加自定义配置类
添加配置类,配置跨域
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
@Configurable
public class CrosConfig {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
//1、配置跨域
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsWebFilter(source);
}
}
方式三:配置Filter过滤器(拦截器也可以):
@WebFilter("/test")
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse)servletResponse;
//设置允许跨域访问的服务域名,*号表示允许所有域访问
//resp.setHeader("Access-Control-Allow-Origin", "www.baidu.com");
response.setHeader("Access-Control-Allow-Origin", "*");
//设置允许跨域的请求方法
response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}
}
方式四:使用@CorsOrigin()注解:
@CorsOrigin()注解可以标注在类上,也可以标注在方法上。在controller类中,在类上标注@CorsOrigin注解表示当前类下的所有方法都支持跨域访问,如果标注在方法上,表示只有当前方法支持跨域访问。这个注解有origins和methods两个属性,origins属性表示允许跨域访问的服务域名,*号表示所有域名都支持,methods是一个RequestMethod对象数组,表示允许跨域的请求方法。
@RestController
@CrossOrigin(origins = "*", methods = {RequestMethod.GET, RequestMethod.POST})
public class TestController {
@GetMapping("/hello")
public String hello(){
return "hello spring";
}
}