Spring Boot解决has been blocked by CORS policy跨域问题

本文介绍了一种在SpringBoot项目中解决前端访问时出现的跨域问题的方法。通过在Controller类上使用@CrossOrigin注解,可以有效地解决因CORS策略导致的'Access-Control-Allow-Origin'缺失的问题。

版权声明


问题描述

后台为Spring Boot项目,在前端进行访问时遇到跨域问题:

...... has been blocked by CORS policy: NoAccess-Control-Allow-Origin...... 

在这里插入图片描述

解决方案

在Controller类上使用@CrossOrigin注解。

import com.cn.springboothelloworldinitializr.entity.User;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;

/**
 * 本文作者:谷哥的小弟
 * 博客地址:http://blog.youkuaiyun.com/lfdfhl
 */

@RestController
@RequestMapping("/MyController3")
// 解决跨域
@CrossOrigin
public class MyController3 {

    @RequestMapping("/test1")
    public void test1(){
        System.out.println("Hello Spring Boot");
    }
}
在Java Spring Boot中,当出现请求头字段token不被预检响应的Access - Control - Allow - Headers允许的问题时,可采用以下解决方案: ### 全局配置 + 拦截器设置 CORS是前后端的一种协商协议,需要前后端配合解决。对于本身已写了拦截器的项目,仅使用@CrossOrigin注解或只写配置类实现全局可能无法解决问题,可采用全局配置与拦截器设置结合的方式。在过滤器中给response设置Header时,每个单词代表允许在请求的Header里设置的key,要确保包含token字段 [^5]。 ### 示例代码 以下是全局配置类的示例: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 允许所有名进行调用 config.addAllowedOriginPattern("*"); // 允许任何请求头 config.addAllowedHeader("*"); // 允许任何方法(POST、GET等) config.addAllowedMethod("*"); // 允许携带凭证 config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } } ``` 上述代码中,通过创建CorsFilter的Bean,允许所有名进行调用,允许任何请求头(包含token)、任何方法,并且允许携带凭证。 ### 调整拦截器 确保拦截器不会阻止预检请求,并且正确处理请求。以下是一个简单的拦截器示例: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CorsInterceptor implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, token"); response.setHeader("Access-Control-Allow-Credentials", "true"); 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() {} } ``` 在这个拦截器中,设置了允许的源、方法、请求头(包含token)等信息,并且对预检请求(OPTIONS方法)直接返回200状态码。 ### 注册拦截器 在Spring Boot配置类中注册拦截器: ```java import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class InterceptorConfig { @Bean public FilterRegistrationBean<CorsInterceptor> corsInterceptorRegistration() { FilterRegistrationBean<CorsInterceptor> registration = new FilterRegistrationBean<>(); registration.setFilter(new CorsInterceptor()); registration.addUrlPatterns("/*"); registration.setName("corsInterceptor"); registration.setOrder(1); return registration; } } ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谷哥的小弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值