经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
springboot 设置CorsFilter跨域不生效的解决
来源:jb51  时间:2021/11/16 11:12:14  对本文有异议

设置CorsFilter跨域不生效的解决

问题描述

公司的前后端开发项目工程,在本地调试的时候遇到了跨域的问题,同事调我的服务一直提示跨域问题,然后前端nb他自己在哪里做了跨域处理,类似nginx那种,但是我还是百度去看了一下,在一个大佬的博客中发现了解决方案。

问题原因是是写的判断登录的filter影响了登录,原因是的这个filter执行顺序在corsfilter之前导致,于是修改了一下跨域设置的配置文件

解决方案

  1. /**
  2. * 使用CORS,用于解决ajax跨域访问问题
  3. */
  4. @Configuration
  5. public class GlobalCorsConfig {
  6. @Bean
  7. public FilterRegistrationBean corsFilter() {
  8. //1.添加CORS配置信息
  9. CorsConfiguration config = new CorsConfiguration();
  10. //1) 允许的域,不要写*,否则cookie就无法使用了
  11. //config.addAllowedOrigin("http://manage.leyou.com");
  12. //config.addAllowedOrigin("http://www.leyou.com");
  13. config.addAllowedOrigin("*");
  14. //2) 是否发送Cookie信息
  15. config.setAllowCredentials(true);
  16. //3) 允许的请求方式
  17. config.addAllowedMethod("OPTIONS");
  18. config.addAllowedMethod("HEAD");
  19. config.addAllowedMethod("GET");
  20. config.addAllowedMethod("PUT");
  21. config.addAllowedMethod("POST");
  22. config.addAllowedMethod("DELETE");
  23. config.addAllowedMethod("PATCH");
  24. config.setMaxAge(3600L);
  25. // 4)允许的头信息
  26. config.addAllowedHeader("*");
  27. //2.添加映射路径,我们拦截一切请求
  28. UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
  29. configSource.registerCorsConfiguration("/**", config);
  30. //3.返回新的CorsFilter.
  31. //return new CorsFilter(configSource);
  32. FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(configSource));
  33. bean.setOrder(0);
  34. return bean;
  35. }
  36. }

跨域配置CorsFilter不生效原因

项目中有多个Filter时,需要通过 @Order(Ordered.HIGHEST_PRECEDENCE) 注解设置过滤器的执行顺序

order的规则

1. order的值越小,优先级越高

2. order如果不标注数字,默认最低优先级,因为其默认值是int最大值

3. 该注解等同于实现Ordered接口getOrder方法,并返回数字。

如果使用如下注释掉的方法进行设置跨域,Filter的doFilter()方法中直接return出去时,前端会提示跨域

因为这个CorsConfig并没有实现Filter接口,即使加上 @Order 注解也不会生效,需要通过如下新的方式返回一个新的FilterRegistrationBean出去,并设置order

  1. import com.nanase.takeshi.constants.JwtConstant;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.core.Ordered;
  7. import org.springframework.web.cors.CorsConfiguration;
  8. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  9. import org.springframework.web.filter.CorsFilter;
  10. /**
  11. * CorsConfig
  12. * 跨域请求配置
  13. *
  14. * @author 725
  15. * @date 2020/12/10 18:17
  16. */
  17. @Slf4j
  18. @Configuration
  19. public class CorsConfig {
  20. private CorsConfiguration buildConfig() {
  21. CorsConfiguration corsConfiguration = new CorsConfiguration();
  22. // 1 设置访问源地址
  23. corsConfiguration.addAllowedOrigin("*");
  24. // 2 设置访问源请求头
  25. corsConfiguration.addAllowedHeader("*");
  26. // 3 设置访问源请求方法
  27. corsConfiguration.addAllowedMethod("*");
  28. // 4 暴露哪些头部信息
  29. corsConfiguration.addExposedHeader(JwtConstant.HEADER);
  30. return corsConfiguration;
  31. }
  32. /**
  33. @Bean
  34. public CorsFilter corsFilter() {
  35. log.info("跨域设置。。。。");
  36. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  37. // 对接口配置跨域设置
  38. source.registerCorsConfiguration("/**", buildConfig());
  39. return new CorsFilter(source);
  40. }
  41. */
  42. @Bean
  43. public FilterRegistrationBean<CorsFilter> corsFilter() {
  44. log.info("跨域设置。。。。");
  45. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
  46. // 5 对接口配置跨域设置
  47. source.registerCorsConfiguration("/**", buildConfig());
  48. //有多个filter时此处设置改CorsFilter的优先执行顺序
  49. FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>(new CorsFilter(source));
  50. bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
  51. return bean;
  52. }
  53. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号