ajax的原生,伪造和jquery讲解

jquery是对Ajax的一个封装,真正的操作是封装里面的内容(基于内部调用原生的Ajax的XMLHTTPRequest)
Ajax还有一种是伪造ajax,所为伪造就是不用XMLHTTPRequest,利用的浏览器的一种技术实现的

XmlHttpRequest对象介绍

XmlHttpRequest对象的主要方法:

void open(String method,String url,Boolen async)
   用于创建请求

   参数:
       method: 请求方式(字符串类型),如:POST、GET、DELETE...
       url:    要请求的地址(字符串类型)
       async:  是否异步(布尔类型)

b. void send(String body)
    用于发送请求

    参数:
        body: 要发送的数据(字符串类型)

c. void setRequestHeader(String header,String value)
    用于设置请求头

    参数:
        header: 请求头的key(字符串类型)
        vlaue:  请求头的value(字符串类型)

d. String getAllResponseHeaders()
    获取所有响应头

    返回值:
        响应头数据(字符串类型)

e. String getResponseHeader(String header)
    获取响应头中指定header的值

    参数:
        header: 响应头的key(字符串类型)

    返回值:
        响应头中指定的header对应的值

f. void abort()

    终止请求

发送

监听状态


<body>
<input type="text" id="i1"> + <input type="text" id="i2"> = <input type="text" id="i3">
<input type="button" value="原生提交ajax" onclick="addajax();">
<script>
    function addajax() {
        var xhr = new XMLHttpRequest();

        xhr.onreadystatechange=function () {
            if(xhr.readyState==4){
                alert(xhr.responseText)
            }
        }
         xhr.open('GET','/add/?i1=11&i2=13');
        xhr.send();
    }
</script>
</body>


上面的内容是在body里面,后台request.post里面是没有数据的,要有需要添加请求头如下图:

XmlHttpRequest对象的主要属性:

a. Number readyState
   状态值(整数)

   详细:
      0-未初始化,尚未调用open()方法;
      1-启动,调用了open()方法,未调用send()方法;
      2-发送,已经调用了send()方法,未接收到响应;
      3-接收,已经接收到部分响应数据;
      4-完成,已经接收到全部响应数据;

b. Function onreadystatechange
   当readyState的值改变时自动触发执行其对应的函数(回调函数)

c. String responseText
   服务器返回的数据(字符串类型)

d. XmlDocument responseXML
   服务器返回的数据(Xml对象)

e. Number states
   状态码(整数),如:200、404...

f. String statesText
   状态文本(字符串),如:OK、NotFound...

伪Ajax

iframe是可以伪造的,不会刷新。结合form来提交数据

填写回调函数
返回来的是放在了iframe里面。如果iframe里面有内容了,说明有返回了。通过onload函数来加载

取值是不一样的,因为有两个document,需要进入这个对象里面


最终的伪造ajax

原生ajax上传文件

views代码

def upload(request):
    if request.method == "GET":
        return render(request,'upload.html')
    else:
        import os
        file_obj = request.FILES.get('wenjian')
        print(file_obj.name)
        file_path = os.path.join('static',file_obj.name)
        with open(file_path,'wb') as f:
            for chun in file_obj.chunks():
                f.write(chun)
        return HttpResponse(file_path)

html代码

<body>
<input type="file" id="i1">
<a onclick="uploadajax();">上传</a>
<div id="con"></div>
<script>
    function uploadajax() {
        var formData = new FormData();//依赖formData这个对象
        formData.append('k1','v1');//通过append来给formData添加数据
        formData.append('wenjian',document.getElementById('i1').files[0]);//这里通过id得到的结果是一个列表,所以可以通过0位置来取第一个值

        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange=function () {
            if(xhr.readyState == 4){
                var file_path = xhr.responseText;
                console.log(file_path)
                var tag = document.createElement('img');
                tag.src = "/" + file_path;
                document.getElementById('con').appendChild(tag);
            }
        };
        xhr.open('POST','/upload/');
        xhr.send(formData)
    }
</script>
</body>

结果:

function upload2(){
            var formData = new FormData();
            formData.append('k1','v1');
            // formData.append('fafafa',document.getElementById('i1').files[0]);
            formData.append('fafafa',$('#i2')[0].files[0]);
            // $('#i2') -> $('#i2')[0]
            // document.getElementById('i1') -> $(document.getElementById('i1'))

            $.ajax({
                url: '/upload/',type: 'POST',data: formData,contentType:false,processData:false,success:function(arg){
                    var tag = document.createElement('img');
                    tag.src = "/"+ arg;
                    $('#container2').append(tag);
                }
            })
        }

#伪造的方法是下面

<h1>伪 Ajax上传文件</h1>
    <form id="f1" method="POST" action="/upload/" target="ifr" enctype="multipart/form-data">
        <iframe id="ifr" name="ifr" style="display: none"></iframe>
        <input type="file" name="fafafa" />
        <a onclick="upload3();">上传</a>
    </form>
    <div id="container3"></div>
function upload3(){
            document.getElementById('ifr').onload = loadIframe;
            document.getElementById('f1').submit();

        }
        function loadIframe(){
            var content = document.getElementById('ifr').contentWindow.document.body.innerText;
             var tag = document.createElement('img');
            tag.src = "/"+ content;
            $('#container3').append(tag);
        }

上传的按钮好看是吧input type=file这个通过opcity来设置为透明度为0

相关文章

$.AJAX()方法中的PROCESSDATA参数 在使用jQuery的$.ajax()方...
form表单提交的几种方式 表单提交方式一:直接利用form表单提...
文章浏览阅读1.3k次。AJAX的无刷新机制使得在注册系统中对于...
文章浏览阅读1.2k次。 本文将解释如何使用AJAX和JSON分析器在...
文章浏览阅读2.2k次。/************************** 创建XML...
文章浏览阅读3.7k次。在ajax应用中,通常一个页面要同时发送...