zoukankan      html  css  js  c++  java
  • 详解Jquery和AngularJs,Servlet中jsonp解决跨域问题(转)

    众所周知,jsonp可以解决跨域问题,下面是我在查阅资料和实际项目使用后的一些总结。

    Jquery中jsonp的使用

    //myUrl = "http://localhost:8090/api/test";
    $.ajax({
      type:"GET",
      url:myUrl,
      dataType:"jsonp",
      jsonp:"callback",
      jsonpCallback:"jsonpCallback",
      success:function(data){
        alert(data.msg);
      }
    });
    function jsonpCallback(data){
      alert(data);
    }
    1. jsonp只能使用get请求,解决同源问题,返回javascript代码,因为请求javascript文件是没有同源问题的。
    2. 当请求数据类型为jsonp时,会将callback=jsonpCallback加在url上,http://localhost:8090/api/testcallback=jsonpCallback
    3. 前台javascript中定义jsonpCallback函数,此函数必须定义在window下,也就是全局的函数,否则找不到。
    4. 后台获取请求的callback参数值jsonpCallback,返回字符串"jsonpCallback(result)",result为返回结果。
    5. 请求返回的是script tag,首先会调用jsonpCallback函数,不管是否找到该函数,都会调用success函数。
    6. 如果没有定义jsonp和jsonpCallback,jsonp默认为"callback",jsonpCallback会是Jquery自动生成的函数名。

    angularJS中jsonp的使用

    myUrl = "http://localhost:8090/api/testcallback=JSON_CALLBACK";
    $http.jsonp(myUrl).success(
      function(data){
        alert(data);
      }
    ); 
    1. angularJS中使用$http.jsonp函数
    2. 指定callback和回调函数名,函数名为JSON_CALLBACK时,会调用success回调函数,JSON_CALLBACK必须全为大写。
    3. 也可以指定其它回调函数,但必须是定义在window下的全局函数。
    4. url中必须加上callback
    5. 当callback为JSON_CALLBACK时,只会调用success,即使window中有JSON_CALLBACK函数,也不会调用该函数。
     Servlet中的使用
    @Override
    protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{
      resp.setContentType("application/json;charset=UTF-8");
      PrintWriterout=resp.getWriter();
      StringcallbackFunName=req.getParameter("callback");
      StringBuilderstringBuilder=newStringBuilder(callbackFunName);
      stringBuilder.append("(");
      stringBuilder.append(123);
      stringBuilder.append(")");
      out.println(stringBuilder.toString());
      out.print(result);
      out.flush();
      out.close();
    }
  • 相关阅读:
    前言
    npm安装全局模块之后项目提示找不到的解决
    mybatisPlus自动填充功能
    springMvc跨域的问题
    mybatisPlus逻辑删除
    java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
    Maven 打包指定名称
    Host is not allowed to connect to this MySQL server
    MySQL 8.0 Public Key Retrieval is not allowed
    SpringBoot1.5 项目启动报错 (jdk.internal.loader.ClassLoaders$AppClassLoader and java.net.URLClassLoader are in module java.base of loader 'bootstrap')
  • 原文地址:https://www.cnblogs.com/JoannaQ/p/3712911.html
Copyright © 2011-2022 走看看