jsonp解决跨域

这篇具有很好参考价值的文章主要介绍了jsonp解决跨域。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JSONP的由来

1、Ajax直接请求普通文件存在跨域无权限访问的问题,不管是静态页面、动态页面、web服务,只要是跨域请求,一律不准。

2、不过我们发现,web页面调用js文件则不受跨域的影响(不仅如此,我们还发现凡是拥有“src”这个属性的标签都拥有跨域的能力,比如<\script>、<\img>、<\iframe>)。

3、于是可以判断,当前阶段如果想通过纯web端跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。

4、恰巧我们知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。

5、这样,解决方案就呼之欲出了,web服务端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件,显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装进去。

6、客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来很像ajax,但其实并不一样。

7、为了便于客户端使用数据,逐渐形成了一种非正式传输协议,简称JSONP。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名包裹在JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

利用jquery实现jsonp

js代码

<script type="application/javascript">
    $("#jsonp").on('click',function () {
        $.ajax({
            type: "GET",
            url: "/jsonp/jsonpTest",
            dataType: 'jsonp',
            jsonp: "callback",
            success: function (response, status, xhr) {
                console.log(response,status,xhr);
            },
            error: function () {
                console.log("请求失败");
            }
        });
    });
</script>

java后端代码

import cn.hutool.json.JSONUtil;
import com.compass.account.plugin.RedisDelayQueue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @ignore
 * @author HuYu
 * @date 2023-06-10
 * @since 1.0
 **/
@Controller
@RequestMapping("/jsonp")
public class JSONPController {

    @Resource
    private RedisDelayQueue redisDelayQueue ;
    /**
     * jsonp测试
     * @return java.lang.String
     * @author compass
     * @date 2023/6/10 1:57
     * @since 1.0.0
     **/
    @ResponseBody
    @GetMapping(value = "/jsonpTest" , produces = {"application/javascript"})
    public String getUserInfo(@RequestParam("callback") String callback, HttpServletResponse response)   {
        response.setContentType("text/html;charset=utf-8");
        Map<String,String> resultMap = new HashMap<>();
        resultMap.put("msg","请求成功");
        resultMap.put("code","200");
        resultMap.put("data","admin");
        String jsonStr = JSONUtil.toJsonStr(resultMap);
        return  callback+"(" + jsonStr + ")";
    }

}

使用原生js调用jsonp

js代码:后端代码不变

    /**
     * 使用原生js发送jsonp请求,当请求结束后返回一个Promise回调
     * @description 使用方式:getRequest('/jsonp/jsonpTest').then(result=>{ console.log(result) })
     * @param url
     * @returns {Promise<Object>}
     */
    function getRequest(url) {
     return  new Promise(((resolve) => {
           // 创建一个全局函数回调
         if (!window.jsonResultHandler){
             window.jsonResultHandler = function (data) {
                 resolve(data);
             };
         }
            
            url = url.indexOf('?')===-1?(url+'?callback=jsonResultHandler'):(url+'&callback=jsonResultHandler');
            let callbackId = 'callback'+new Date().getTime();
            let script = document.createElement('script');
            script.setAttribute('src', url);
            script.setAttribute('id', callbackId);
            document.getElementsByTagName('head')[0].appendChild(script);
            // script加载完成后执行回调,然后删除掉scrip标签
            if(script.readyState){
                script.onreadystatechange=function(){
                    if(script.readyState==='complete'||script.readyState==='loaded'){
                        script.onreadystatechange=null;
                        window.jsonResultHandler();
                        let callbackDom =   document.getElementById(callbackId);
                        if (callbackDom){
                            callbackDom.remove();
                        }
                    }
                }
            }else{
                script.onload=function(){
                    window.jsonResultHandler();
                    let callbackDom =   document.getElementById(callbackId);
                    if (callbackDom){
                        callbackDom.remove();
                    }
                }

            }
        }))


    }
    getRequest('/jsonp/jsonpTest').then(result=>{ 
        console.log(result) 
    })

核心思路:就是利用script标签不会产生跨域,然后使用script标签去发送请求,然后后端返回一个script类型回调函数,然后这个回调函数在前端是一个全局变量的函数,随后被后端回调,这样就解决了跨域的问题,但是这种方式只支持get请求。文章来源地址https://www.toymoban.com/news/detail-598656.html

到了这里,关于jsonp解决跨域的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Fastapi+Jsonp实现前后端跨域请求

    2024年01月19日
    浏览(32)
  • WEB攻防通用漏洞&跨域CORS资源&JSONP回调&域名接管劫持

    目录 一、同源策略(SOC) 二、跨域资源(COSP) 三、回调跨域(JSOP) 四、CORS资源跨域-敏感页面原码获取 五、JSONP 回调跨域-某牙个人信息泄露 六、子域名劫持接管 同源策略 (SOP)-“ 同源 ” 包括三个条件:同协议、同域名、同端口。 会检测数据包的来源在哪里,进而来判

    2024年02月01日
    浏览(56)
  • JSONP的安全性较差,那么在跨域情况下,有没有其他更安全的替代方案呢?

    在跨域情况下,为了保证安全性,有几种更安全的替代方案可以考虑使用: 1:CORS(Cross-Origin Resource Sharing): CORS 是一种现代化的跨域解决方案,通过在服务器端设置响应头来控制跨域访问。 服务器可以配置允许跨域请求的来源(域名)、请求方法和头部信息等,以确保仅

    2024年02月03日
    浏览(26)
  • 前端面试:【跨域与安全】跨域问题及解决方案

    嗨,亲爱的Web开发者!在构建现代Web应用时,跨域问题和安全性一直是不可忽视的挑战之一。本文将深入探讨跨域问题的背景以及解决方案,以确保你的应用既安全又能与其他域名的资源进行互操作。 1. 什么是跨域问题? 跨域问题指的是在Web开发中,浏览器的同源策略(S

    2024年02月11日
    浏览(47)
  • 前端跨域问题解决方法

    跨域是 WEB浏览器专有 的同源限制访问策略。(后台接口调用和postman等工具会出现) 跨源资源共享(CORS,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资

    2024年02月13日
    浏览(34)
  • js跨域的解决方案

    指的是浏览器不能执行其他网站的脚本,简单来说是浏览器同源政策的限制,浏览器针对于ajax的限制。 同源政策 两个页面拥有相同的 协议,端口,域名 就是同源,如果有一个不相同就是不同源。 同源政策产生的目的 保护用户信息安全,防止一些网站盗取用户信息。 常见

    2024年02月10日
    浏览(31)
  • [前端原生技术]jsonp

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18031965 出自【进步*于辰的博客】 在学习了Jsoup这个知识点之后,发觉js的这一特点真的很强大—— 动态解释 。 本文以实用性的角度对Jsonp进行阐述,故在有些方面不是很详

    2024年04月08日
    浏览(35)
  • 使用nginx解决跨域问题(前端解决)

    情况是这样的:编写好的前端页面本地打开是没有问题的,请求都能发出去,接收到正确的响应结果。但是,使用nginx来部署这个页面就会出现跨域问题。 跨域 :由于浏览器的同源策略,即属于不同域的页面之间不能相互访问各自的页面内容 注 :同源策略,单说来就是同协

    2024年02月11日
    浏览(39)
  • js跨域问题及解决方法汇总

    浏览器为了保证用户信息的安全,防止恶意网站窃取数据,禁止不同域之间的js交互。对于浏览器而言,只要协议、域名、端口其中有一个不同就会触发同源策略,造成跨域,从而限制交互 cookie、storage、indexDB等不能获取 ajax不能发送请求、dom树无法获得 如果一个网页可以随

    2024年02月10日
    浏览(27)
  • 解决前端跨域的几种方法

    一、跨域报错         在我们实际开发过程中,都有遇到过跨域的问题,跨域报错如下: 二、为什么会报跨域?         跨域的本质是浏览器基于同源策略的一种安全手段,主要是考虑到用户的信息安全。何为同源策略呢?同源策略是一种约定,它是浏览器最核心也

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包