• Ajax:ajax实现跨域解决方案jsonp



    目录:

    (1)ajax跨域解决方案值jsonp方式初步

    (2)ajax跨域解决方案值jsonp方式深入

    (3)ajax跨域解决方案之jQuery封装jsonp


    (1)ajax跨域解决方案值jsonp方式初步

     

    ajax2.html:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>jsonp实现跨域title>
    6. head>
    7. <body>
    8. <script type="text/javascript">
    9. /**
    10. * 这是我自定义的函数
    11. */
    12. function sayHello(data){
    13. //alert("hello world!")
    14. alert("hello," + data.name)
    15. }
    16. function sum(){
    17. alert("求和。。。")
    18. }
    19. script>
    20. <script type="text/javascript" src="http://localhost:8081/b/jsonp1?fun=sum">script>
    21. body>
    22. html>

     

     JSONPServlet1:

    1. package com.bjpowernode.b.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. import java.io.PrintWriter;
    9. @WebServlet("/jsonp1")
    10. public class JSONPServlet1 extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    13. throws ServletException, IOException {
    14. // 在后台输出
    15. //System.out.println("jsonp方式完成跨域访问");
    16. // 向前端响应一段js代码呢?
    17. PrintWriter out = response.getWriter();
    18. //out.print("alert(123)"); // 这是响应一段js代码,只不过这个alert函数是JS内置的函数,可以直接用。
    19. // 注意:不要误以为是后端java代码调用了sayHello()函数,实际上后端只负责响应一个字符串回去。
    20. // 真正的调用者,还是浏览器,浏览器接收到这个字符串之后,会自动将这个字符串当做一段js代码解释执行。
    21. //out.print("sayHello()"); // 这也是响应一段JS代码。只不过这个sayHello函数是程序员自定义的。
    22. //响应一段js代码,然后传一个json数据给前端
    23. //out.print("sayHello({\"name\" : \"jackson\"})");
    24. // 动态获取函数名
    25. String fun = request.getParameter("fun");
    26. //out.print(fun + "({\"name\" : \"jackson\"})");
    27. out.print(fun + "()");
    28. }
    29. }

    out.print会向前端

    才发送请求, 然后执行servlet,servlet给它响应一段js代码回去,它接收到js代码解释并执行,显示效果,它并没有达到局部刷新的效果,我们让它达到局部刷新的效果,我们点击某一个按钮,我们让它局部刷新,显然上面让页面打开的时候加载script标签就不行了,我们可以让他先加载完,点击 页面某一个按钮去加载script标签,来达到页面的局部刷新,整个过程跟ajax没有关系

    设计一个按钮点击之后触发script,发起请求,从后端获取数据之后,再把获取到的数据在下方div中显示 

    ajax3.html:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>jsonp跨域title>
    6. head>
    7. <body>
    8. <script type="text/javascript">
    9. // 自定义的函数
    10. function sayHello(data){ // data是一个json:{"username" : "lucy"}
    11. document.getElementById("mydiv").innerHTML = data.username
    12. }
    13. window.onload = () => {
    14. document.getElementById("btn").onclick = () => {
    15. // 加载script元素
    16. // 创建script元素对象
    17. const htmlScriptElement = document.createElement("script");
    18. // 设置script的type属性
    19. htmlScriptElement.type = "text/javascript"
    20. // 设置script的src属性
    21. htmlScriptElement.src = "http://localhost:8081/b/jsonp2?fun=sayHello"
    22. // 将script对象添加到body标签中(这一步就是加载script)
    23. document.getElementsByTagName("body")[0].appendChild(htmlScriptElement)
    24. }
    25. }
    26. script>
    27. <button id="btn">jsonp解决跨域问题,达到ajax局部刷新的效果button>
    28. <div id="mydiv">div>
    29. body>
    30. html>

    JSONPServlet2:

    1. package com.bjpowernode.b.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/jsonp2")
    9. public class JSONPServlet2 extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    12. throws ServletException, IOException {
    13. // 获取函数名
    14. String fun = request.getParameter("fun");
    15. // 响应一段js代码 lucy可能是从数据库查询的名字
    16. response.getWriter().print(fun + "({\"username\" : \"lucy\"})");
    17. }
    18. }

    点击按钮:

     

    (3)ajax跨域解决方案之jQuery封装jsonp

     

     把别人封装好的jQuery库复制到项目中:

     ajax4.html:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>jQuery的jsonp封装解决ajax跨域问题title>
    6. head>
    7. <body>
    8. <script type="text/javascript" src="/a/js/jquery-3.6.0.min.js">script>
    9. <script type="text/javascript">
    10. // 这个函数不需要你写,jQuery可以自动帮助你生成
    11. //function jQuery3600508253314856699_1655528968612(json){ // 系统自动生成的这个函数默认情况,会自动调用success的回调函数。 }
    12. $(function(){
    13. $("#btn").click(function(){
    14. // 发送所谓的ajax请求(其实本质上并不是一个ajax请求。只是披着ajax的皮。乔装打扮的ajax。)
    15. $.ajax({
    16. type : "GET", // jsonp请求只支持get请求。
    17. // 虽然这里的url是这样写的,但实际上发送的请求是:/b/jsonp3?callback=jQuery3600508253314856699_1655528968612&_=1655528968613
    18. // callback=jQuery3600508253314856699_1655528968612
    19. // callback就是我们之前的fun
    20. // jQuery3600508253314856699_1655528968612就是我们之前的sayHello,而这个名字是jQuery自动为我们生成的。
    21. url : "http://localhost:8081/b/jsonp3",
    22. dataType : "jsonp", // 指定数据类型是jsonp形式。【最关键的是它】
    23. success : function(data){ // data变量用来接收服务器端的响应(data是一个json:{"username":"lisi"})
    24. $("#mydiv").html("欢迎你:" + data.username)
    25. }
    26. })
    27. })
    28. })
    29. script>
    30. <button id="btn">jQuery库封装的jsonpbutton>
    31. <div id="mydiv">div>
    32. body>
    33. html>

     

    JSONPServlet3:

    1. package com.bjpowernode.b.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/jsonp3")
    9. public class JSONPServlet3 extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    12. throws ServletException, IOException {
    13. // 获取函数名 默认的是callback
    14. String callback = request.getParameter("callback");
    15. // 响应一段js代码,调用函数
    16. response.getWriter().print(callback + "({\"username\":\"lisi\"})");
    17. }
    18. }

    可以自己设置回调函数:

     ajax4.html:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>jQuery的jsonp封装解决ajax跨域问题title>
    6. head>
    7. <body>
    8. <script type="text/javascript" src="/a/js/jquery-3.6.0.min.js">script>
    9. <script type="text/javascript">
    10. // 这个函数不需要你写,jQuery可以自动帮助你生成
    11. //function jQuery3600508253314856699_1655528968612(json){ // 系统自动生成的这个函数默认情况,会自动调用success的回调函数。 }
    12. // 自定义的函数
    13. function sayHello(data){
    14. $("#mydiv").html("欢迎你:" + data.username)
    15. }
    16. $(function(){
    17. $("#btn").click(function(){
    18. // 发送所谓的ajax请求(其实本质上并不是一个ajax请求。只是披着ajax的皮。乔装打扮的ajax。)
    19. $.ajax({
    20. type : "GET", // jsonp请求只支持get请求。
    21. // 虽然这里的url是这样写的,但实际上发送的请求是:/b/jsonp3?callback=jQuery3600508253314856699_1655528968612&_=1655528968613
    22. // callback=jQuery3600508253314856699_1655528968612
    23. // callback就是我们之前的fun
    24. // jQuery3600508253314856699_1655528968612就是我们之前的sayHello,而这个名字是jQuery自动为我们生成的。
    25. url : "http://localhost:8081/b/jsonp3",
    26. dataType : "jsonp", // 指定数据类型是jsonp形式。【最关键的是它】
    27. jsonp : "fun", // 不采用默认的参数名callback,用这个属性来指定具体的参数名。
    28. jsonpCallback : "sayHello" // 不采用默认的回调函数,用这个属性来指定具体的回调函数。
    29. /*success : function(data){ // data变量用来接收服务器端的响应(data是一个json:{"username":"lisi"})
    30. $("#mydiv").html("欢迎你:" + data.username)
    31. }*/
    32. })
    33. })
    34. })
    35. script>
    36. <button id="btn">jQuery库封装的jsonpbutton>
    37. <div id="mydiv">div>
    38. body>
    39. html>

    JSONPServlet3:

    1. package com.bjpowernode.b.web.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/jsonp3")
    9. public class JSONPServlet3 extends HttpServlet {
    10. @Override
    11. protected void doGet(HttpServletRequest request, HttpServletResponse response)
    12. throws ServletException, IOException {
    13. // 获取函数名 默认callback
    14. //String callback = request.getParameter("callback");
    15. String callback = request.getParameter("fun");
    16. // 响应一段js代码,调用函数
    17. response.getWriter().print(callback + "({\"username\":\"lisi\"})");
    18. }
    19. }

    启动项目:如果这个jQuery报404,可能是没有导入到项目中,可以去项目的底层目录下去查看

     发现真的没有赋值的那个jQuery-3.6.0.min.js

     这时需要   Rebuild一下a Model

     在查看底层目录下,就出现了js目录

     重新刷新页面:响应成功

  • 相关阅读:
    Rtools安装方法
    leetcode82-Remove Duplicates from Sorted List II
    ICMP Ping实现
    Spring的概念和核心注解
    案例分享 | 纽扣电池石墨片厚度及缺陷检测
    程序员福音,关于如何使用Markdown写出一份漂亮的简历 —— 程序员简历 | md文档简历制作教程
    Leetcode 位运算
    Oracle 19c LISTAGG 函数中distinct
    工业互联网标识解析的数据安全风险有哪些?
    23、Plenoxels: Radiance Fields without Neural Networks
  • 原文地址:https://blog.csdn.net/dengfengling999/article/details/125949527