跨域问题的解决
现在的web项目大多都是前后端分离的了,前端使用axios,后端使用springboot,前后端服务器不在一个域中,由此带来的跨域问题不可避免,这里总结一下常见的跨域解决方法。
1.在过滤器中编写允许跨域的代码
// 获取当前请求地址
String origin = request.getHeader(HttpHeaders.ORIGIN);
// 允许跨域的地址(不能为*)
response.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, origin);
// 允许携带的请求头字段(如果需要自定义请求头,需要增加content-type字段,原因未知)
response.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "session,content-type");
// 允许客户端访问的请求头
response.addHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
// 允许跨域的请求方式
response.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "*");
// 允许跨域行为
response.addHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
filterChain.doFilter(request, response);
2.在springboot中自定义CorsFilter类
@Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 允许跨域的域名 config.addAllowedOrigin("http://www.baidu.com"); // 有多个的时候可以使用这个方法 config.setAllowedOrigins(new ArrayList<String>()); config.setAllowCredentials(true); config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.setMaxAge(3600L); UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource(); configurationSource.registerCorsConfiguration("/**", config); return new CorsFilter(configurationSource); }
3.还有一种springboot自带的跨域解决方法,但有时候似乎不太管用,还有点麻烦
@RestController @RequestMapping("/test") @CrossOrigin( origins = "", methods = {RequestMethod.GET, RequestMethod.DELETE} ) public class testController { @GetMapping(value = "/t") public String test() { return "123456"; } }