`
阅读更多

springboot CORS 跨域请求解决三大方案,springboot CorsFilter解决跨域问题

springboot CORS解决 No 'Access-Control-Allow-Origin' header is present on the requested resource

 

================================

©Copyright 蕃薯耀 2020-11-24

http://fanshuyao.iteye.com/

 

跨域请求,一般是在页面调用ajax请求向别的服务发送请求,因域名不相同,导致跨域

解决跨域请求的方式有:

一、远程服务器支持跨域请求(CORS 跨域)

二、使用nginx反向代理

三、服务器端使用Http请求

四、使用jsonp

 

下面以远程服务器支持跨域请求(CORS 跨域)为例:

其中有三种方式让远程服务器支持跨域请求

方式一、使用注解:@CrossOrigin

1、在类上加注解,表示类下所有方法都支持跨域请求

@CrossOrigin
@RestController
@RequestMapping("cross")
public class AaaController {

}

 

2、在方法加注解,表示该方法运动跨域请求

@RestController
@RequestMapping("cross")
public class AaaController {

    @CrossOrigin
    @RequestMapping("/bbb")
    public Result bbb(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ……
    }
}

 

方式二、实现WebMvcConfigurer接口,重写addCorsMappings方法(官方文档全局配置跨域请求使用的是此方式)

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.test.util.JsonUtil;


@Configuration
public class MvcConfig implements WebMvcConfigurer {

	/**
	 * 解决跨域请求
	 * @return
	 */
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/**")
		.allowCredentials(true)
		.allowedOrigins("*")
		.allowedHeaders("*")
		.allowedMethods("*")
		.maxAge(3600);

		WebMvcConfigurer.super.addCorsMappings(registry);
	}



	/**
	 * 解决@RestController返回json结果时,IE浏览器出现下载json文件的现象。
	 * @return
	 */
	@Bean
	public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
		MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
		
		List<MediaType> supportedMediaTypes  = new ArrayList<MediaType>();
		supportedMediaTypes.add(new MediaType(MediaType.TEXT_PLAIN, Charset.forName("UTF-8")));
		supportedMediaTypes.add(new MediaType(MediaType.TEXT_HTML, Charset.forName("UTF-8")));
		jsonConverter.setSupportedMediaTypes(supportedMediaTypes);
		
		jsonConverter.setObjectMapper(JsonUtil.getMapper());//设置使用jackson转换器
		
		return jsonConverter;
	}
	

	@Override
	public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
		converters.add(jackson2HttpMessageConverter());
	}
	
}

 

 

方式三、使用CorsFilter过滤器

import org.springframework.boot.web.servlet.FilterRegistrationBean;
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 HttpFilterConfig {

	@Bean
	public FilterRegistrationBean<CorsFilter> corsFilter() {
		CorsConfiguration corsConfig = new CorsConfiguration();
		corsConfig.setAllowCredentials(true);
		corsConfig.addAllowedOrigin(CorsConfiguration.ALL);
		corsConfig.addAllowedMethod(CorsConfiguration.ALL);
		corsConfig.addAllowedHeader(CorsConfiguration.ALL);
		//默认可不设置这个暴露的头。这个为了安全问题,不能使用*。设置成*,后面会报错:throw new IllegalArgumentException("'*' is not a valid exposed header value");
		//corsConfig.addExposedHeader("");
		corsConfig.setMaxAge(3600L);
		
		UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
		configSource.registerCorsConfiguration("/**", corsConfig);
		
		FilterRegistrationBean<CorsFilter> corsBean = new FilterRegistrationBean<CorsFilter>(new CorsFilter(configSource));
		corsBean.setName("crossOriginFilter");
		corsBean.setOrder(0);//这个顺序也有可能会有影响,尽量设置在拦截器前面
		return corsBean;
	}
	
	
}

 

 

前端页面调用示例:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跨域请求</title>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
</head>
<body>

	<div>跨域请求</div>
	
<script type="text/javascript">
function ajax(){
	console.log("ajax()");
	$.ajax({  
		//async: false,//设置为同步,默认为异步(一般不需要)  
		url : "http://aaa.com:7010/gtkjCghj/workflow/processes",  //aaa.com域名修改host文件
		type : "post",  
		dataType : "json",
		//contentType: "application/json;charset=UTF-8",//contentType如果设置成application/json;charset=UTF-8,就会会变成复杂请求,导致发送2次请求,第一次是options请求,第二次才是真正的请求。
		data : {
			"processName" : "报批",
			"gxDocNo": "f2-202000234"
		},
		complete : function(XMLHttpRequest, textStatus){  
			//alert("textStatus="+textStatus);  
		},  
		error : function(XMLHttpRequest, textStatus, errorThrown){  
			if("error" == textStatus){  
				alert("服务器未响应,请稍候再试");  
			}else{  
				alert("请求失败,textStatus="+textStatus);  
			}  
		 },  
		 success : function(data){  
			 if(data != null){  
				 console.log("data===" + JSON.stringify(data));
			 }else{  
				 alert("返回结果为空!");  
			 }  
		 }  
	}); 
};


ajax();
</script>

</body>
</html>

 

 

 

注意事项: 

需要注意的是ajax请求中的contentType

contentType默认的值是:application/x-www-form-urlencoded,当不设置或者为默认值时,这个是简单请求,只发送1次真正的请求。
如果contentType设置成"application/json;charset=UTF-8"会变成复杂请求,导致发送2次请求,第一次是options请求,第二次才是真正的请求。

部分服务器,是禁止发送OPTIONS请求的,这样会导致跨域问题:

jquery-3.4.1.min.js:2 OPTIONS http://test.com/gtkjCghj/workflow/processes 401 (Unauthorized)
has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

 

 

简单请求
只要同时满足以下条件就属于简单请求
1、请求方法是以下三种方法之一:GET、POST、HEAD
2、Http的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type。

Content-Type只限于三个值:application/x-www-form-urlencoded、multipart/form-data、text/plain

 

简单请求的请求头示例:
其中:Content-Type: application/x-www-form-urlencoded; charset=UTF-8

POST /gtkjCghj/workflow/processes HTTP/1.1
Host: aaa.com:7010
Connection: keep-alive
Content-Length: 212
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://127.0.0.1:7010
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://127.0.0.1:7010/gtkjCghj/static/cross.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

 

 

非简单请求,发送OPTIONS的请求头:

OPTIONS /gtkjCghj/workflow/processes HTTP/1.1
Host: aaa.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://aaa.com:7010
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://127.0.0.1:7010/gtkjCghj/static/cross.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9

 

 

spring CORS跨域请求解决方案总结:(建议采用方案1)

1、springboot CORS 跨域请求解决三大方案,springboot CorsFilter解决跨域问题

https://www.iteye.com/blog/fanshuyao-2517777

 

2、cors-filter使用,cors-filter解决跨域访问,cors-filter跨域请求

https://www.iteye.com/blog/fanshuyao-2517803

 

3、org.ebaysf.web的cors-filter使用,cors-filter跨域请求

https://www.iteye.com/blog/fanshuyao-2517820

 

4、java tomcat-catalina CorsFilter使用,apache tomcat-catalina CorsFilter使用

https://www.iteye.com/blog/fanshuyao-2517821

 

5、springboot jsonp 跨域请求,springboot使用jsonp跨域

https://www.iteye.com/blog/fanshuyao-2517789

 

 

================================

©Copyright 蕃薯耀 2020-11-24

http://fanshuyao.iteye.com/

1
2
分享到:
评论

相关推荐

    Springboot CORS跨域设置.md

    Springboot CORS跨域设置

    解决 springboot跨域请求问题

    在现代Web应用开发中,前后端...总的来说,解决SpringBoot的跨域问题需要理解同源策略和CORS机制,并根据项目规模和需求选择合适的方法。正确配置后,前后端分离的应用就能顺畅地进行数据交互,提供良好的用户体验。

    vue+springboot实现项目的CORS跨域请求

    跨域资源共享CORS(Cross-origin Resource Sharing),是W3C的一个标准,允许浏览器向跨源的服务器发起XMLHttpRequest请求,克服ajax请求只能同源使用的限制。关于CORS的详细解读,可参考阮一峰大神的博客:跨域资源...

    Spring boot 和Vue开发中CORS跨域问题解决

    本文旨在详细阐述CORS跨域问题的背景、解决方法以及如何在Spring Boot和Vue.js的结合使用场景下处理跨域问题。 ### CORS跨域问题背景 CORS全称是Cross-Origin Resource Sharing,即跨源资源共享。这个概念是W3C的...

    Springboot处理CORS跨域请求的三种方法

    以下将详细介绍Spring Boot处理CORS跨域请求的三种方法。 1. **使用`@CrossOrigin`注解** `@CrossOrigin`是Spring提供的一个注解,用于配置控制器或方法,允许特定的跨域请求。当在控制器类或具体方法上添加此...

    解决springboot实现跨域session共享问题

    综上所述,解决Spring Boot中的跨域session共享问题和防止SQL注入,需要结合CORS配置、分布式session存储和安全编程实践。通过合理的配置和编程习惯,我们可以构建更加健壮、安全的Web服务。提供的压缩包文件`...

    CORS跨域资源共享及解决方案.docx

    ### CORS跨域资源共享及其解决方案详解 #### 一、CORS跨域资源共享背景 在现代Web应用开发中,前后端分离已成为一种主流趋势。在这种模式下,前端负责展示逻辑,而后端处理业务逻辑与数据交互。然而,由于浏览器...

    SpringBoot应用跨域访问解决方案.docx

    针对跨域问题,有多种解决方案,主要分为前端解决方案、使用代理服务器和CORS(跨域资源共享)三种类型。 ##### 2.1 前端解决方案 - **HTML资源标签**:`&lt;script&gt;`、`&lt;link&gt;`、`&lt;img&gt;` 和 `&lt;iframe&gt;` 标签不受同源...

    详解springboot设置cors跨域请求的两种方式

    CORS 机制可以解决这个问题,允许 Web 应用程序跨域请求资源。 2. 如何设置 CORS? 可以使用 CorsFilter 或者 CorsConfig 两种方式设置 CORS。使用 CorsFilter 需要 override doFilterInternal 方法,并在该方法中...

    解决Vue调用springboot接口403跨域问题

    解决Vue调用Spring Boot接口时出现的403跨域问题,可以通过在Spring Boot后端添加@CrossOrigin注解或者通过全局配置类来实现CORS支持。需要注意的是,这需要Spring Boot版本至少为2.x,因为旧版本可能不支持CORS相关...

    JQuery跨域访问解决方案

    JQuery的跨域解决方案主要依赖于JSONP(JSON with Padding)技术。JSONP是一种绕过同源策略的方式,它利用HTML中的`&lt;script&gt;`标签没有同源策略限制的特点。当jQuery使用`dataType: 'jsonp'`时,它实际上是在做以下几...

    GeoServer配置解决cors跨域问题的依赖jar包和配置说明.zip

    geoserver跨域设置: 1、将cors-filter-2.4.jar和java-property-utils-1.9.1.jar,两个jar包文件放入geoserver目录下webapps\geoserver\web-inf\lib中。 2、打开geoserver目录下webapps\geoserver\web-inf中的web....

    cors跨域Tomcat文件

    【标题】"cors跨域Tomcat文件"涉及的是在Web开发中解决跨域问题的一种常见方法,即使用CORS(Cross-Origin Resource Sharing)机制在Apache Tomcat服务器上配置和实现。CORS是一种允许浏览器安全地从不同源加载资源...

    cors跨域问题对应的jar包.zip

    "cors跨域问题对应的jar包.zip"这个压缩包文件包含了处理跨域问题所需的两个关键库:`cors-filter-1.7.jar`和`java-property-utils-1.9.1.jar`。`cors-filter`是一个实现了CORS规范的Java过滤器,它允许我们在Tomcat...

    SpringMVC CORS跨域测试包

    在现代Web应用程序中,由于前后端分离的设计,跨域问题常常出现,CORS为解决这个问题提供了安全的解决方案。 在SpringMVC框架中,实现CORS功能主要涉及到以下知识点: 1. **CORS原理**:CORS是通过浏览器和服务器...

    react中fetch之cors跨域请求的实现方法

    React 中的 CORS 跨域请求实现方法 React 是一个流行的前端框架, Fetch 是一个内置的 JavaScript 函数,用于发送网络请求。然而,在使用 Fetch 时,经常会遇到跨域问题,即无法从不同域名下的服务器获取数据。这篇...

    跨域请求解决方案源代码(JSONP,CORS)

    在提供的压缩包中,`TestAjax`可能是包含实现JSONP和CORS跨域请求的示例代码文件。这个文件可能包含了创建XMLHttpRequest对象、设置请求头、处理响应等内容的JavaScript代码,用于演示如何在实际项目中应用这些跨域...

    Springboot跨域CORS处理实现原理

    本文主要介绍了 Springboot 跨域 CORS 处理实现原理,通过示例代码详细讲解了跨域问题产生、解决方案和实现原理,对大家的学习或者工作具有一定的参考学习价值。 一、源(Origin) 在 HTTP 协议中,每个 URL 由三...

    springboot_跨域_

    SpringBoot提供了解决跨域问题的强大工具,开发者可以通过`@CrossOrigin`注解或自定义CORS过滤器来设定跨域策略。在确保安全性的前提下,灵活调整配置以满足前后端分离的开发需求。理解并正确配置跨域策略,是构建...

    CORS跨域访问框架jra包

    总的来说,`CORS跨域访问框架jra包`简化了在Java Web应用中实现CORS支持的过程,让开发者能够更便捷地处理跨域请求,提升用户体验,同时确保安全性。对于需要进行跨域操作的Web应用,这是一个非常实用的工具。

Global site tag (gtag.js) - Google Analytics