当前位置:   article > 正文

springboot设置跨域的几种方式_springboot 跨域配置放开(allow origin、method、header设置为“*”

springboot 跨域配置放开(allow origin、method、header设置为“*”)

在进行web项目开发的时候,前后端分离往往是很常见的开发方式,而说到前后端分离,最常见的问题无非就是跨域了。如何解决跨域问题几乎已经成为了web开发的必修课。本文将提供几种常见的基于springboot的跨域解决思路,鉴于作者水平有限,若有错误,欢迎指正。

单个Controller及方法:

       @CrossOrigin作为一个强大的注解,特点就是不仅支持在controller中设置,还支持方法级注解。而最简单也最直接的方法,那就是在controller中直接加入。

@CrossOrigin(origins = "*",allowCredentials = "true")

 

全局跨域:

上述方法@CrossOrigin虽然支持单位注解,但是若是要配置全局,未免就太过繁琐了。这时候可以尝试以下三种方法。

1. servlet过滤器Filter

通过自定义自己的OriginFilter,实现javax.servlet.Filter接口里的doFilter方法,并声明为Component组件,贴出关键代码如下:

  1. @Override
  2. public void doFilter(ServletRequest req, ServletResponse res,
  3. FilterChain chain) throws IOException, ServletException {
  4. HttpServletResponse response = (HttpServletResponse) res;
  5. response.setHeader("Access-Control-Allow-Origin", "*");
  6. response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,PUT");
  7. response.setHeader("Access-Control-Max-Age", "3600");
  8. response.setHeader("Access-Control-Allow-Headers",
  9. "Origin, X-Requested-With, Content-Type, Accept, " + "X-CSRF-TOKEN");
  10. response.setHeader("Access-Control-Allow-Credentials","true");
  11. chain.doFilter(req, res);
  12. }

2. 设置CorsConfiguration

使用spring自带的CorsConfiguration解决跨域问题,并使用@Configuration声明为配置类。代码如下:

  1. @Configuration
  2. public class CustomCORSConfiguration {
  3. private CorsConfiguration buildConfig() {
  4. CorsConfiguration corsConfiguration = new CorsConfiguration();
  5. corsConfiguration.addAllowedOrigin("*");
  6. corsConfiguration.addAllowedHeader("*");
  7. corsConfiguration.addAllowedMethod("*");
  8. corsConfiguration.setAllowCredentials(true);
  9. return corsConfiguration;
  10. }
  11. @Bean
  12. public CorsFilter corsFilter() {
  13. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  14. source.registerCorsConfiguration("/**", buildConfig());
  15. return new CorsFilter(source);
  16. }
  17. }

 

3. WebMvcConfigurer

在spring2.0中,通过自定义的WebMvcConfigurer可以让我们进一步地自定义自己的web项目,同样的,我们可以在这处理相关的跨域问题。首先,我们需要创建一个配置类,让它继承自WebMvcConfigurationSupport,同时使用@Configuration注解标记该配置类。然后重写它的addCorsMappings即可。代码如下:

  1. @Configuration
  2. public class WebMvcConfigurer extends WebMvcConfigurationSupport{
  3. @Override
  4. protected void addCorsMappings(CorsRegistry registry) {
  5. registry.addMapping("/**").allowedOrigins("*")
  6. .allowCredentials(true).allowedMethods("*").maxAge(3600);
  7. }
  8. }

此外,还可以在该配置类通过重写addViewControllers方法配置项目启动的首页,以及通过addResourceHandlers方法控制静态资源的请求路径,包括下述的拦截器也可以通过重写这里的addInterceptors方法进行添加。

4. 自定义拦截器重写请求

此外,我们还可以自定义一个拦截器,通过在preHandle中拦截到的HttpServletResponse,对header重新进行设置。对header的设置同方法1,然后再方法3中的WebMvcConfigurer中,通过重写addInterceptors方法添加该拦截器即可。有兴趣的读者可以自行实现。

重点:

无论采用上述哪种方式,在进行跨域访问的时候,必须设置withCredentials为true,以jquery为例,ajax请求中须添加

  xhrFields: {  withCredentialstrue },

 

总结:

     上述解决方式几乎都是通过重新设置HttpServletResponse的header实现的。其中,关键代码为:

  1. response.setHeader("Access-Control-Allow-Origin", "*");
  2. response.setHeader("Access-Control-Allow-Credentials","true");

通过上述方法,可以解决基本的跨域问题。如果你的跨域问题仍得不到解决,可以参考一下我的下一篇博客 新版chrome跨域问题:cookie之SameSite属性,或许对你会有帮助。

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/629149
推荐阅读
相关标签
  

闽ICP备14008679号