最近,用Springboot做服务器遇到了跨域问题。

遇见跨域问题的原因为:在VUE写的前端,在界面访问另一个不同的URL时,遇到了跨域问题。

跨域问题之所以出现,是因为AJAX只允许同源,即相同的URL头访问。该方案避免了不同源服务器之间访问的安全问题。

值得注意的是:相同的IP地址,但端口不一样,也会被认为不是同源。

解决跨域问题的关键是:允许不同源URL进行访问,即允许跨域。

可以让前端VUE来解决,但既然笔者是负责Springboot开发的,就先解决Springboot的跨域问题。

解决方案如下:

1)用CrosFilter(全局解决跨域问题)

@Component
public class CORSFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse rsp = (HttpServletResponse) response;
        rsp.addHeader("Access-Control-Allow-Credentials", "true");
        rsp.addHeader("Access-Control-Allow-Origin", "*");
        rsp.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        rsp.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
		
        chain.doFilter(request, response);
    }
}

2)重写WebMVCConfigurer(全局解决跨域问题)

@Configuration
public class GlobalCorsConfig {
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")    //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置
                        .allowedOrigins("*")    //开放哪些ip、端口、域名的访问权限
                        .allowCredentials(true)  //是否允许发送Cookie信息
                        .allowedMethods("GET","POST", "PUT", "DELETE")     //开放哪些Http方法,允许跨域访问
                        .allowedHeaders("*");     //允许HTTP请求中的携带哪些Header信息
            }
        };
    }
}

或

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurer{
 
   @Override
    protected void addCorsMappings(CorsRegistry registry) {
        registry
		.addMapping("/**")
		.allowedOrigins("*")
		.allowCredentials(true)
		.allowedMethods("*")
		.maxAge(3600);
    }
}

3)使用注解(局部解决跨域问题)

@RestController
@CrossOrigin(origins = "*") //局部跨域
public class HelloController {
	@RequestMapping("/hello")
	public String hello() {
		return "hello world";
	}
}

4)设置响应头(局部解决跨域问题)

@RequestMapping("/hello")
public String hello(HttpServletResponse response) {
	response.addHeader("Access-Allow-Control-Origin","*");
	return "hello";
}

还有其他方法,本文不再一一列举。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐