SpringBoot和Vue跨域问题

本文介绍了SpringBoot项目中解决跨域问题的三种方法:全局配置跨域、使用@CrossOrigin注解以及自定义跨域过滤器。每种方法都有详细的步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Access to XMLHttpRequest at ‘http://localhost:8082/demotest_war_exploded/sayHello’ from origin ‘http://10.205.198.119:8080’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

上面这个报错信息一般都是跨域问题,在springboot和Vue这种前后端分离的项目中,一般都会发生这种问题。对于解决跨域,有以下方法

全局配置跨域

可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。

package com.org.demotest.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    static final String[] ORIGINS = new String[]{"GET", "POST", "PUT", "DELETE"};  //请求方式

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") //所有的当前站点的请求地址,都支持跨域访问
                .allowedOriginPatterns("*")    // 所有的外部域都可跨域访问,这里注意2.4.0以后是allowedOriginPatterns,以前是allowedOrigins
                .allowCredentials(true)  //是否支持跨域用户凭证
                .allowedMethods(ORIGINS) //当前站点支持的跨域请求类型是什么
                .maxAge(3600);  //超是时长,单位为秒。
    }
}

使用 @CrossOrigin 注解

Controller层在需要跨域的类或者方法上加上该注解即可。这样不需要跨域访问的类或方法不添加该注解即可

@CrossOrigin(origins = "*",maxAge = 3600)

自定义跨域过滤器


// 跨域过滤器
@Component
public class CORSFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//*号表示对所有请求都允许跨域访问
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
            response.getWriter().println("Success");
            return;
        }
        chain.doFilter(request, response);
    }
 
    @Override
    public void destroy() {
 
    }
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }

// 注册过滤器
@Configuration
public class CorsConfig {
 
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值