1.@CrossOrigin
- 作用范围:局部
-
在 controller 类上加上 @CrossOrigin
- 表示这个 controller 类中的 所有方法允许 跨域资源共享 的
@CrossOrigin @RequestMapping(value = "/api/product/index") public class IndexController{}
-
在 controller 类中的方法 @CrossOrigin
- 表示这个 方法 允许 跨域资源共享的
@CrossOrigin() @GetMapping("/product/index") public String getProductIndex() { return "Product Index"; }
-
@CrossOrigin 不起作用的情况
-
Cookie 问题
https://blog.csdn.net/qq_45721173/article/details/124634565
-
2.全局配置
-
解决方案一
-
添加一个 SpringMvc 的配置类
@Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 路径规则 (所有的controller) .allowCredentials(true) // 是否允许在跨域的情况下传递cookie .allowedOriginPatterns("*") // 允许请求来源的域规则 .allowedMethods("*") .allowedHeaders("*"); } }
-
-
解决方案二
-
添加一个 配置类(适合在 SpringScurity 和 SpringMvc 环境中)
@Configuration public class GlobalCorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedOriginPattern("*"); config.setAllowCredentials(true); config.addAllowedMethod("*"); config.addAllowedHeader("*"); config.addExposedHeader("*"); UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource(); configSource.registerCorsConfiguration("/**", config); return new CorsFilter(configSource); } }
-
3.以上三种都不起作用
- 以下内容来自 ChatGPT
-
确保服务器代码被正确加载和运行:
-
确认你的配置类或注解被Spring扫描并加载。
-
确认服务器正在重新启动以应用更改。
-
-
检查浏览器的缓存:
- 有时候,浏览器会缓存CORS请求的结果。尝试清理浏览器缓存或使用隐身模式进行测试。
-
验证服务器响应头:
- 使用浏览器的开发者工具(例如Chrome的F12)检查网络请求的响应头,确认是否包含正确的CORS头。
-
使用过滤器:
-
尝试使用过滤器来手动添加CORS头。
@Component public class CorsFilter implements javax.servlet.Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; HttpServletRequest request = (HttpServletRequest) req; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, X-Requested-With"); if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); } else { chain.doFilter(req, res); } } @Override public void init(FilterConfig filterConfig) { } @Override public void destroy() { } }
-
-
其他调试步骤
-
检查你的端口和URL:确认你访问的URL和端口是正确的。
-
确保请求路径匹配:确认你的请求路径与配置中的路径匹配。
-
使用Postman或类似工具:使用Postman等工具发送请求,检查响应头。
-