• 前端常用跨域解决方案


    笔者对跨域的知识比较模糊,只知道jsonp cors和webpack中设置proxy,现系统复习一下

     什么叫浏览器的同源策略?

    协议 域名 端口号 三者都一样就是同源,只要有一个不同就是跨域

    1、jsonp

    script   img    link   iframe   不存在跨域请求的限制

    引入cdn jquery.min.js    html可以访问到此js, jsonp就是利用这个

     html+ajax请求

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>JSONP练习</title>
    </head>
    <body>
        <script src="https://lib.baomitu.com/jquery/3.5.1/jquery.min.js"></script>
        <!-- <script src="./JSONP.js"></script> -->
        <script>
            $.ajax({
                url:'http://127.0.0.1:8001/list',
                method:'get',
                dataType:'jsonp', // 执行的是jsonp的请求
                success:res=>{
                    console.log(res)
                }
            })
        </script>
    </body>
    </html>

    node请求

    let express = require('express')
    app = express()
    app.listen('8001',_ =>{
        console.log('8001成功开启')
    })
    app.get('/list',(req,res)=>{
        // 请求传递过来一个callback
        let { callback = Function.prototype} = req.query
        let data = {
            code:0,
            message:'JSONP请求成功'
        }
        res.send(`${callback}(${JSON.stringify(data)})`)
    })

     JSONP的缺点:JSONP只能处理GET请求,安全性不高,容易被请求拦截改请求

    2.CORS跨域资源共享

     在实际项目过程中经常会遇到跨域的请求报错

     

    客户端发送请求

     

     node服务端允许跨域(通过设置响应头header允许哪个源可以向它跨域传输)

     

     客户端axios设置

    axios.default.baseURL = "http://127.0.0.1:8888";
    axios.default.withCredential = true; //允许跨域携带cookic信息,axios默认是请求的时候不会带上cookie的
    axios.default.headers['Content-Type'] = 'application/x-www-form-urlencoded';
    axios.default.transformRequest = function(data){ //transformRequest在向服务器发送前,修改请求数据
        if(!data) return data;
        let result = ``;
        for(let attr in data){
            if(!data.hasOwnProperty(attr)) break;
            result += `&${attr}=${data[attr]}`;
        }
        return result.substring(1); //请求结果变成aa=xxx&bb=xxx
    }
    axios.interceptors.response.use(function onFulfilled(response){
        return response.data;
    },function onRejected(reason){
        return Promise.reject(reason);
    });
    axios.default.validateStatus = function (status){ //状态码
        return /^(2|3)d{2}$/.test(status);
    }

     服务端常用设置相关的头信息(需要处理options试探性请求)

     http proxy =>webpack webpack-dev-server

    nginx 反向代理 

  • 相关阅读:
    简直喝血!H.265要被专利费活活玩死
    python异常处理
    开始好好总结所学东西了,马上校招了~~
    pip 安装管理失败解决
    去除空格
    自定义开关(不带有滑动,只具有点击切换开关功能)
    Android-ViewPagerIndicator框架使用——TabPageIndicator以及样式的修改
    Android详细的对话框AlertDialog.Builder使用方法
    Fragment+FragmentTabHost组件实现常见主页面(仿微信新浪)
    Activity生命周期
  • 原文地址:https://www.cnblogs.com/gengzhen/p/14056153.html
Copyright © 2020-2023  润新知