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测试数据:7010/gtkjCghj/workflow/processes " , // aaa测试数据域名修改host文件
type : " post " ,
dataType : " json " ,
// contentType: "application/json;charset=UTF-8",//contentType如果设置成application/json;charset=UTF-8,就会会变成复杂请求,导致发送2次请求,第一次是options请求,第二次才是真正的请求。
data : {
" processName " : " 报批 " ,
" gxDocNo " : " f2-202000234 " ,
" ssotoken " : " eyJpc3N1Y2Nlc3MiOiJ0cnVlIiwiZmFpbHJlc29uIjoiIiwiYWNjb3VudCI6Inplbmd6aW0iLCJ0b2tlbiI6ImE5YzA5YTdjYWRlOTQwNjFiNzdmYzMxNjhkZDI2Mzc3In0=.Eg4DFhERDQ== "
},
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测试数据/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.
================================
?Copyright 蕃薯耀 2020-11-24
https://HdhCmsTestcnblogs测试数据/fanshuyao/
springboot 解决跨域请求,No 'Access-Control-Allow-Origin' header is present on the requested resource
标签:运动 异步 new err success script min dia ret
查看更多关于springboot 解决跨域请求,No 'Access-Control-Allow-Ori的详细内容...