HTTP跨域问题

1、什么是跨域问题

浏览器的同源策略 会阻止一个域的javascript脚本和另外一个域的内容进行交互

2、解决方案

2.1 Jsonp解决方案

跨域资源嵌入的jsonp

同源策略允许 跨域资源嵌入,因此我们可以借此实现跨域;

跨域资源嵌入常见的有:<script src="..."></script><img src="..."><iframe src="...">

客户端向服务器发送请求,提交参数(参数值为方法名)

<script>
	function fun(data) {
		console.log(data);
	}
</script>
<script src="http://localhost:8080/test?callback=fun" type="text/javascript"></script>

服务器端接收参数,并将参数值(方法名)与括号、数据拼接起来,返回给客户端
客户端收到:fun(‘this is return data’),这是一条JS语句,所以会被执行

@ResponseBody
@RequestMapping("test")
public String test(String callback) {
	String data = "this is return data";
	return callback + "('" + data + "')";
}

使用AJAX的jsonp
本质与方法1相同,都是提交方法名作为参数,然后将方法名和括号、数据拼接并返回

<script>
	function fun(data) {
		console.log(data);
	}

	$(function() {
		$.ajax({
			url:"http://localhost:8080/test",
			type:"get",
			dataType:"jsonp",
			jsonpCallback:"fun",
		});
	})
</script>
@ResponseBody
@RequestMapping("test")
public String test(String callback) {
	String data = "this is return data";
	return callback + "('" + data + "')";
}

2.2 CORS解决方案

在响应头中设置允许跨域,客户端就可以直接获取数据
这种方法的好处在于:前端不需要使用JSONP,照常提交就可以

$.get("http://localhost:8080/test",function(data) {
	console.log(data);
})

设置响应头

@ResponseBody
@RequestMapping("test")
public String test(String callback, HttpServletRequest request, HttpServletResponse response) {
	response.addHeader("Access-Control-Allow-Origin", "*");
	response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
	response.addHeader("Access-Control-Allow-Headers", "Content-Type");
	return "this is return data";
}

配置跨域过滤器

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedOrigin("*");
        config.addAllowedMethod("*");
        config.addAllowedHeader("*");
        // 在最新版Spring要允许Cookie跨域,AllowedOrigin不能设置为*
        config.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
        configSource.registerCorsConfiguration("/**", config);

        return new CorsFilter(configSource);
    }

}

3、相关博客

https://www.cnblogs.com/yuansc/p/9076604.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值