• No 'Access-control-Allow-Origin' header is present on the requested resource 跨域问题


      在IDEA中有一套微服务,然后在webStorm中写前端代码,前端使用ajax访问Controller:

    function getDate(){
          var id=$("#id").val();
          $.ajax({
               type:"post",
               dataType:"json",
               url:"http://localhost:8081/index/test",
               data:{"id":id},
               success:function (data){
                   alert(data.time);
               },
               error:function (data){
                   alert(JSON.stringify(data));
               }
          }) 
    }

      后端Controller会返回一个Map,执行没有问题,但是ajax一直执行error,F12发现出错: No 'Access-control-Allow-Origin' header is present on the requested resource。

    查询后,发现是因为跨域了,跨域访问违反了同源策略!

    同源:域名,协议,端口相同。

    同源策略:浏览器的ajax只能访问跟它的html页面相同域名或IP的资源。

    同源策略是浏览器的行为,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收

    前端的IP是localhost:63343,后端IP是localhost:8081,这样导致ajax能访问后端(只是简单的调用),但是不能获得其返回值!

    第一种方法,还是没能接受,第二种方法成功了,第三种最简单!

    解决方法:

    第一种:

    使用ajax 的jsonp:

      修改前端ajax:

    function getDate(){
          var id=$("#id").val();
          $.ajax({
               type:"post",
               dataType:"jsonp",
               jsonp:"callback",
               contentType:"application/jsonp;charset=utf-8",
               url:"http://localhost:8081/index/test",
               data:{"id":id},
               success:function (data){
             var data1=data["dataOne"]; alert(data1.time); }, error:
    function (data){ alert(JSON.stringify(data)); } }) }

      修改后端Controller方法:

        public String test(String id, String callback){
        /*
         *执行serviceImpl
         */    
         return callback+"({dataOne:"+map+"})";
    }

    第二种,启动类里配置,类似于zuul网关配置,见参考二:

    public static void main(String[] args) {
            SpringApplication.run(DemoUaaApplication.class, args);
        }
        @Bean
        public CorsFilter corsFilter() {
            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            final CorsConfiguration config = new CorsConfiguration();
            config.setAllowCredentials(true); // 允许cookies跨域
            config.addAllowedOrigin("*");// 允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
            config.addAllowedHeader("*");// 允许访问的头信息,*表示全部
            config.setMaxAge(18000L);// 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
            config.addAllowedMethod("*");// 允许提交请求的方法,*表示全部允许
            config.addAllowedMethod("HEAD");
            config.addAllowedMethod("GET");// 允许Get的请求方法
            config.addAllowedMethod("PUT");
            config.addAllowedMethod("POST");
            source.registerCorsConfiguration("/**", config);
            return new CorsFilter(source);
        }
    }

    第三种,在类前面配置:@CrossOgigin(origins="*",maxAge=3600)

    @RestController
    @RequestMapping("index")
    @CrossOrigin(origins="*",maxAge=3600)
    public class TestOne{
      @RequestMapping("/test")   
    public Map test(String id){    /*    *执行serviceImpl    */    return Map;   }
    }

    参考一:https://segmentfault.com/a/1190000012469713

    参考二:https://blog.csdn.net/m0_37556444/article/details/82832054

  • 相关阅读:
    c++中重载、重写、覆盖的区别
    c++值传递,指针传递,引用传递以及指针与引用的区别
    c/c++中static与extern关键字介绍
    Typedef和#define之间的区别
    c++中sizeof()的用法介绍
    c++笔试题:不使用第三个变量来交换俩个变量的数值
    c++位运算符介绍
    3.高并发教程-基础篇-之分布式全文搜索引擎elasticsearch的搭建
    2.高并发教程-基础篇-之nginx+mysql实现负载均衡和读写分离
    1.高并发教程-基础篇-之nginx负载均衡的搭建
  • 原文地址:https://www.cnblogs.com/zhuii/p/11691596.html
Copyright © 2020-2023  润新知