javascript基础-ajax

摘要:
XHR XHR是AJAX的核心。编写本机ajax请求varxhr=newXMLHttpRequest()//创建XHR实例XHR。打开//启动请求。Jsonp原理使用<script>标记。CallbackName是全局函数名。正在写入前端$。ajax背景PrintWriterwriter=null;尝试{writer=response.getWriter();Stringcallback=request.getParameter;response.setContentType;writer.write;//调用客户端的全局函数并插入数据datawriter.flush();returnnull;}catch{logger.error;}imgvariable=newImage();img.onload=img.oneror=function(){alert(“完成!

先看几种B/S交互的对比

B/S方式阻塞页面历史记录协议
URL: get——自动记录
浏览器前进后退可访问
http/https
form: get/post完全阻塞自动记录
浏览器前进后退可访问
http/https
ajax: get/post同步阻塞
异步不阻塞
HTML5才支持无刷新改变页面URLhttp/https

ajax异步请求时不阻塞页面,不影响用户的持续操作。这是ajax流行的原因。

XHR

  XHR是AJAX的核心,写一个原生的ajax请求

    var xhr = new XMLHttpRequest();//创建XHR实例
    xhr.open('get','queNames.do', false);//启动请求。args[0]请求方式   args[1] URL args[2] async
    xhr.send(null);//发送请求

    if((xhr.status >= 200 && xhr.status <300) || xhr.status == 304){    //请求成功
        cnosole.info(xhr.responseText);//拿到响应数据
    }

xhr.abort()//中断请求

  

HTTP协议

  ajax通过HTTP协议来完成交互,需要知道基本的HTTP协议知识

javascript基础-ajax第1张 


跨域

  因为同源策略(ip,端口,域名)的限制,ajax不支持跨域访问,但项目中经常碰到跨域的需求

  几种跨域的对比

跨域方式请求方法需改造后台缺陷
jsonpget无法携带凭证过去
imgget单向传递,不能获取响应
CORSget/post完美!

       常用的这三种。其他更偏门的swf、父子iframe跨域这里不做讨论。CORS协议跨域,在IE8-不支持。标准浏览器均支持。

  jsonp

  原理

    利用<script>标签。src里设置请求URL+callbackName。 callbackName即全局函数名。后台在输出流时调用此函数。

      写法

    前端(以jquery举例)

$.ajax({
        url: "...",   
        dataType: 'jsonp',   
        jsonp:'callback',   
        success: function(data) {
        }
        ...
});

            后台

        PrintWriter writer = null;
        try {
                writer = response.getWriter();
                String callback = request.getParameter("callback");
                response.setContentType("application/javascript;charset=UTF-8");
                writer.write(callback + "(" + data + ")");//调用客户端的全局函数,塞入数据data
                writer.flush();
                return null; 
        } catch (IOException e) {
                logger.error(e.toString());
        }

   img

var img = new Image();
img.onload = img.onerror = function() {
    alert("Done!");
};
img.src = "http://www.suning.com/a.do?name=value";

   CORS

     我在这篇博文附了写法

  

安全

    ajax容易遭到CSRF攻击,两种方式来防范:1,敏感信息如密码用SSL连接   2,携带随机数

    点击此博文进一步理解

  

调试

  打开chrome浏览器,按F12

      javascript基础-ajax第2张

Advanced Ajax 介绍

类型描述原理适合场景
Comet(服务器推送)服务器向页面推送数据的技术,目的是保证数据的实时更新。Ajax是页面向服务器请求数据。Comet则是服务器向页面推送数据。两者相反。短轮询:不断发请求
长轮询: 客户端请求-->服务器挂起,直到有数据响应-->客户端再请求
HTTP流: 
适合股票,互联网抢拍等需要实时同步的场景
SSE只读Comet服务器响应特定的MIME类型(text/event-stream)来保证数据传递给EventSource
自动断开重连。
通过事件open/close/error来控制连接
断开时,通过ID来保证数据顺序。
不需要传递数据给服务器的同步场景
Web SocketWebSocket的目标是在一个持久连接上提供双向通信WebSocket协议 ws://
依赖专门的服务器
Web QQ或聊天室

   Comet 

短轮询: 
前端:setInterval($.ajax..,2000)
后台:——

长轮询: 
前端:$ajax-reponse-$ajax
      请求..响应--请求..响应--...
后台: 数据未更新之前不关闭连接

HTTP流: 
前端: xhr.onreadystatechange监听-->readyState==3时渲染数据
后端:开启线程监听,不关闭连接,有数据时输出,刷新缓存。

    SSE

var source = new EventSource(url);//创建SSE
source.onmessage = function(data){};//收到消息时
source.onerror = function(e){};//连接错误时
source.close();//关闭连接

    Web Socket

    var socket = new WebSocket('ws://localhost:8080'); // 创建一个Socket实例
    socket.onopen = function(event) {     //打开socket

        socket.send('suning!');      //发送消息给服务器

        socket.onmessage = function(event) {    //监听服务器消息的返回
            console.info('message',event);
        };

        socket.onclose = function(event) {        //监听关闭
        };

        socket.close();// 关闭Socket
    }

    点击此博文进一步理解

免责声明:文章转载自《javascript基础-ajax》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇针对Fluent-Bit采集容器日志的补充Django的View(视图)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# Socket编程 同步以及异步通信

套接字简介:套接字最早是Unix的,window是借鉴过来的。TCP/IP协议族提供三种套接字:流式、数据报式、原始套接字。其中原始套接字允许对底层协议直接访问,一般用于检验新协议或者新设备问题,很少使用。 套接字编程原理:延续文件作用思想,打开-读写-关闭的模式。 C/S编程模式如下: Ø服务器端: 打开通信通道,告诉本地机器,愿意在该通道上接受客户请求...

【移动开发】WIFI热点通信(二)

相信大家在上一篇中已经了解了Android中WIFI热点通信的相关操作知识(http://smallwoniu.blog.51cto.com/3911954/1536126),今天我们将在上一篇代码基础之上进行Socket编程,实现一个简单的多人聊天室功能,以达到热点网络上的通信目的。     首先,我们先来看一张最终效果图: <=======>...

java中的TCP SERVER代码

package tcpserver; import java.awt.*;import java.awt.event.*;import javax.swing.*;import com.borland.jbcl.layout.*;import java.net.*;import java.io.*;/** * <p>Title: TCPServ...

4wpa_supplicant适配层 详解

适配层是 通用的wpa_supplicant的 封装,在Android中 作为 WiFi部分的 硬件抽象层来使用。wpa_supplicant适配层 主要用于 与wpa_supplicant守护进程 的 通信,以提供给Android框架使用,它实现了 加载、控制 和 消息监控等功能。           1、当java层调用 loadDriver时, 它...

【转载】C# MVC 实现登录的5种方式

C# MVC 实现登录的5种方式     最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。    十年河东十年河西,莫欺少年穷。     学无止境,精益求精    小弟之前做过三月的MVC,后来又一直webForm开发,再后来,也就是现在做WPF,最近随着项目进入尾声,也就慢慢清闲了下来,清闲的时间甚是无聊,...

linux下socket keep alive讲解

【需求】 不影响服务器处理的前提下,检测客户端程序是否被强制终了。【现状】服务器端和客户端的Socket都设定了keepalive属性。服务器端设定了探测次数等参数,客户端、服务器只是打开了keepalive机能服务器端起了一个监视线程,利用select来检测socket是否被关闭。。。 下面这是我的一点肤浅理解。 1.关于keep alive 无论win...