如何实现跨域请求

首先我们来理解一下什么是跨域,和出现跨域的根本原因是什么!

简单的来说跨域就是两个不同源的页面。

而之所以出现跨域问题的根本原因就是浏览器的同源策略不允许非同源的URL之间进行资源的相互访问。

而我们要如何区解决这个问题呢?

如今我们,我们有两种方法去解决这个问题,1.通过JSONP 2.通过CORS

先来说JSONP,JSONP就是利用<script>标签不受浏览器的同源策略的影响,可以通过src属性来请求非同源的js脚本,但它只是一个临时解决的方法。且只支持GET请求

  <script>
        function success(data){
            console.log("请求回来的数据:");
            console.log(data);
        }
      
    </script>
    <script src="http://localhost:8082/jsonp?callback=success" ></script>

通过设置src属性来访问服务端,这里callback就是在服务端调用success方法来返回数据

这个很多人会有迷惑服务端是如何知道要返回callback的,我们传给后端一个callback后,后端会接受到callback,然后生成一个callback的函数将这个函数返回给调用。

@RestController
@RequestMapping("/jsonp")
public class jsonp {
    @ResponseBody
    @GetMapping
    public String json(@RequestParam(value = "callback",required = false)String callback, HttpServletResponse response){
//        response.setHeader("Access-Control-Allow-Origin","*");
        String str ="{hello:hello}";
        return callback+"("+str+")";

    }
}

我们同时可以使用jQuery的方式去实现JSONP

<script>
            $.ajax({
                url: "http://localhost:8082/jsonp",
                type:"get",
                dataType: "jsonp",
                success: function(res){
                    console.log("返回来的数据时:");
                    console.log(res);
                }
            
            })       
             </script>

其实ajax实现JSONP的过程也许是通过script标签。

在我们发起JSONP请求时,会动态的想<header>中append一个<script>标签

在JSONP请求成功后,会动态的从<header>中移除刚才append进去的<script>标签

下面我们来看看CORS如何实现

CORS从根本上解决了跨域问题,支持get post请求

第一种直接使用@CrossOrigin注解

@RestController
@RequestMapping("/cors")
public class cors {
    @GetMapping
    @CrossOrigin
    public String cor(){

        String str ="{hello:hello}";
        return str;

    }
}

第二种使用配置文件的方式

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter(){
        CorsConfiguration corsConfiguration=new CorsConfiguration();
        //允许跨域的主机地址,*表示所有都可以
        corsConfiguration.addAllowedOrigin("*");
        //允许跨域的请求头
        corsConfiguration.addAllowedHeader("*");
        //允许跨域的请求方法
        corsConfiguration.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsFilter(source);
    }
}

使用cors我们就不用通过scprit标签这种形式去访问了

直接正常访问都可以了

 <script>
        $.ajax({
            type:"GET",
            url:"http://localhost:8082/cors",
        
            success: function(res){
                console.log(res);
            }

        })
    </script>

如果想深入了解Cors可以多多查阅资料,我这里只是给你一个思路。欢迎私信进行交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值