zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Vim快捷键键位图大全
    Docker快速入门
    针对base64编码和URIEncode的一点研究
    JavaEE初学笔记之Servlet与Tomcat
    【编码】彻底弄懂ASCII、Unicode、UTF-8之间的关系
    React的世界观及与Vue之比较
    彻底搞懂CSS文本、空白换行问题
    Vue实现懒加载的基本思路
    CSS中的px与物理像素、逻辑像素、1px边框问题
    Vue插值文本换行问题
  • 原文地址:https://www.cnblogs.com/zhuii/p/11691596.html
Copyright © 2011-2022 走看看