跨域问题的解决

现在的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";
    }

}

 

posted @ 2022-05-03 12:46  听雷雨声  阅读(131)  评论(0编辑  收藏  举报