AJAX相关知识

1.AJAX概述

1)AJAX可以让浏览器发送一种特殊的请求,这种请求可以是:异步的。

2)AJAX可以做到页面的局部刷新

2.XMLHttpRequest对象

  • XMLHttpRequest对象是AJAX的核心对象,发送请求以及接收服务器数据的返回,全靠它了。

  • XMLHttpRequest对象,现代浏览器都是支持的,都内置了该对象。直接用即可。

  • 创建XMLHttpRequest对象

var xhr = new XMLHttpRequest();
  • XMLHttpRequest对象的方法

    • open(method, url, async, user, psw) :

      method:请求类型 GET 或 POST

      url : 资源路径

      async:true(异步)或 false(同步)

      user:可选的用户名称

      psw:可选的密码

      send() :将请求发送到服务器,用于 GET 请求

      send(string) :将请求发送到服务器,用于 POST 请求

  • XMLHttpRequest对象的属性

    • onreadystatechange : 定义当 readyState 属性发生变化时被调用的函数

    • readyState : 保存 XMLHttpRequest 的状态。0:请求未初始化 1:服务器连接已建立 2:请求已收到 3:正在处理请求 4:请求已完成且响应已就绪

    • responseText : 以字符串返回响应数据

    • status : 返回请求的状态号200: "OK"403: "Forbidden"404: "Not Found"

3.AJAX GET请求

<script type="text/javascript">
    window.onload = function () {
        document.getElementById("btn").onclick = function () {
            //1. 创建AJAX核心对象
            var xhr = new XMLHttpRequest();
            //2. 注册回调函数
            xhr.onreadystatechange = function(){
                if (this.readyState == 4) {
                    if (this.status == 200) {
                        // 通过XMLHttpRequest对象的responseText属性可以获取到服务器响应回来的内容。
                        // 并且不管服务器响应回来的是什么,都以普通文本的形势获取。(服务器可能响应回来:普通文本、XML、JSON、HTML...)
                        // innerHTML属性是javascript中的语法,和ajax的XMLHttpRequest对象无关。
                        // innerHTML可以设置元素内部的HTML代码。(innerHTML可以将后面的内容当做一段HTML代码解释并执行)
                        //document.getElementById("myspan").innerHTML = this.responseText
                        document.getElementById("mydiv").innerHTML = this.responseText
                        // innerText也不是AJAX中的,是javascript中的元素属性,和XMLHttpRequest无关。
                        // innerText也是设置元素中的内容,但是即使后面是一段HTML代码,也是将其看做一个普通字符串设置进去。
                        //document.getElementById("myspan").innerText = this.responseText
                    }else{
                        alert(this.status)
                    }
                }
            }
            //3. 开启通道
            xhr.open("GET", "/ajax/ajaxrequest2", true)
            //4. 发送请求
            xhr.send()
        }
    }
</script>
  • AJAX get请求如何提交数据呢?

    • get请求提交数据是在“请求行”上提交,格式是:url?name=value&name=value&name=value....

    • 其实这个get请求提交数据的格式是HTTP协议中规定的,遵循协议即可。

4. AJAX GET请求的缓存问题

  • 对于低版本的IE浏览器来说,AJAX的get请求可能会走缓存。存在缓存问题。对于现代的浏览器来说,大部分浏览器都已经不存在AJAX get缓存问题了。

  • 什么是AJAX GET请求缓存问题呢?

    • 在HTTP协议中是这样规定get请求的:get请求会被缓存起来。

    • 发送AJAX GET请求时,在同一个浏览器上,前后发送的AJAX请求路径一样的话,对于低版本的IE来说,第二次的AJAX GET请求会走缓存,不走服务器。

  • POST请求在HTTP协议中规定的是:POST请求不会被浏览器缓存。

  • GET请求缓存的优缺点:

    • 优点:直接从浏览器缓存中获取资源,不需要从服务器上重新加载资源,速度较快,用户体验好。

    • 缺点:无法实时获取最新的服务器资源。

  • 浏览器什么时候会走缓存?

    • 第一:是一个GET请求

    • 第二:请求路径已经被浏览器缓存过了。第二次发送请求的时候,这个路径没有变化,会走浏览器缓存。

  • 如果是低版本的IE浏览器,怎么解决AJAX GET请求的缓存问题呢?

    • 可以在请求路径url后面添加一个时间戳,这个时间戳是随时变化的。所以每一次发送的请求路径都是不一样的,这样就不会走浏览器的缓存问题了。

    • 可以采用时间戳:"url?t=" + new Date().getTime()

    • 或者可以通过随机数:"url?t=" + Math.random()

    • 也可以随机数+时间戳....

5. AJAX POST请求

// 4. 发送AJAX POST请求
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") // 设置请求头的内容类型。模拟form表单提交数据。
// 获取表单中的数据
var username = document.getElementById("username").value;
var password = document.getElementById("password").value;
// send函数中的参数就是发送的数据,这个数据在“请求体”当中发送。
xhr.send("username="+username+"&password="+password)

6.AJAX乱码问题

  • 对于tomcat9来说呢?

    • 响应中文的时候,会出现乱码,怎么解决?

      response.setContentType("text/html;charset=UTF-8");
    • 发送ajax post请求的时候,发送给服务器的数据,服务器接收之后乱码,怎么解决?

      request.setCharacterEncoding("UTF-8");

7.AJAX跨域问题

  • 跨域是指从一个域名的网页去请求另一个域名的资源。比如从百度(百度一下,你就知道)页面去请求京东(京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!)的资源。

  • 通过超链接或者form表单提交或者window.location.href的方式进行跨域是不存在问题的

  • 在一个域名的网页中的一段js代码发送ajax请求去访问另一个域名中的资源,由于同源策略的存在导致无法跨域访问,那么ajax就存在这种跨域问题。

同源还是不同源

  • 区分同源和不同源的三要素

    • 协议

    • 域名

    • 端口

  • 协议一致,域名一致,端口号一致,三个要素都一致,才是同源,其它一律都是不同源

8. AJAX跨域解决方案

  • 方案1:设置响应头

    • response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080"); // 允许某个
      response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有
  • 方案2:jsonp

    • jsonp不是一个真正的ajax请求。只不过可以完成ajax的局部刷新效果。可以说jsonp是一种类ajax请求的机制。

    • jsonp不是ajax请求,但是可以完成局部刷新的效果,并且可以解决跨域问题。

    • 注意:jsonp解决跨域的时候,只支持GET请求。不支持post请求。

    • <script type="text/javascript" src="http://localhost:8081/b/jsonp2?fun=sayHello"></script>
      // 通过导入javascript的标签中的src属性发送请求实现跨域
  • jQuery封装的jsonp

    • $.ajax({
          type : "GET",
          url : "跨域的url",
          dataType : "jsonp", // 指定数据类型
          jsonp : "fun", // 指定参数名(不设置的时候,默认是:"callback")
          jsonpCallback : "sayHello" // 指定回调函数的名字
                                     // (不设置的时候,jQuery会自动生成一个随机的回调函数,
                                     //并且这个回调函数还会自动调用success的回调函数。)
      })
  • 代理机制(httpclient)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值