基本概念

Ajax 全称是异步的 JavaScript 和 XML 。 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用 AJAX)如果需要更新内容,必须重载整个网页页面。

Ajax 具有以下优点和缺点:

  • 优点

    1. 无需刷新页面,用户体验好;
    2. 异步与服务器通信,不影响主进程,响应更迅速;
    3. 可以把部分服务器的工作放在客户端的浏览器完成,减轻服务器压力,减少冗余请求和响应;
    4. Ajax 是前端开发的标准化技术,无需插件支持,跨平台性能好;
  • 缺点

    1. Ajax 请求不修改浏览器历史记录,因此不支持前进后退功能;
    2. Ajax 暴露了过多和服务器交互的细节;
    3. 破坏了程序的异常机制,容易调试;
    4. 不利于搜索引擎抓取信息;

同源策略

同源策略是Netscape提出的一个著名的安全策略,它是指同一个“源头”的数据可以自由访问,但不同源的数据相互之间都不能访问。我们试想一下以下几种情况: 
1. 我们打开了一个天猫并且登录了自己的账号,这时我们再打开一个天猫的商品,我们不需要再进行一次登录就可以直接购买商品,因为这两个网页是同源的,可以共享登录相关的 cookie 或 localStorage 数据; 
2. 如果你正在用支付宝或者网银,同时打开了一个不知名的网页,如果这个网页可以访问你支付宝或者网银页面的信息,就会产生严重的安全的问题。显然浏览器不允许这样的事情发生; 
3. 想必你也有过同时登陆好几个 qq 账号的情况,如果同时打开各自的 qq 空间浏览器会有一个小号模式,也就是另外再打开一个窗口专门用来打开第二个 qq 账号的空间。

很明显,第1个和第3个例子中,不同的天猫商店和 qq 空间属于同源,可以共享登录信息。qq 为了区别不同的 qq 的登录信息,重新打开了一个窗口,因为浏览器的不同窗口是不能共享信息的。而第2个例子中的支付宝、网银、不知名网站之间是非同源的,所以彼此之间无法访问信息,如果你执意想请求数据,会提示异常:

  1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
  • 1

那么什么是同源的请求呢?同源请求要求被请求资源页面和发出请求页面满足3个相同:

协议相同 
域名相同 
端口相同

简单理解一下:

  1. /*以下两个数据非同源,因为协议不同*/
  2. http://www.abc123.com.cn/item/a.js
  3. https://www.abc123.com.cn/item/a.js
  4. /*以下两个数据非同源,因为域名不同*/
  5. http://www.abc123.com.cn/item/a.js
  6. http://www.abc123.com/item/a.js
  7. /*以下两个数据非同源,因为主机名不同*/
  8. http://www.abc123.com.cn/item/a.js
  9. http://item.abc123.com.cn/item/a.js
  10. /*以下两个数据非同源,因为协议不同*/
  11. http://www.abc123.com.cn/item/a.js
  12. http://www.abc123.com.cn:8080/item/a.js
  13. /* 以下两个数据非同源,域名和 ip 视为不同源
  14. * 这里应注意,ip和域名替换一样不是同源的
  15. * 假设www.abc123.com.cn解析后的 ip 是 195.155.200.134
  16. */
  17. http://www.abc123.com.cn/
  18. http://195.155.200.134/
  19. /*以下两个数据同源*/ /* 这个是同源的*/
  20. http://www.abc123.com.cn/source/a.html
  21. http://www.abc123.com.cn/item/b.js
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Ajax

Ajax在编写时一共4个步骤:

  1. 创建 xhr 对象
  2. 设置传输地址
  3. 设置回调函数
  4. 发送数据

常见的发送方式有 GET 和 POST,除此之外还有 HEAD, DELETE, TRACE, PUT, CONNECT, OPTIONS和 PATCH等,这里只举例前两个 GET 和 POST。

例如根据姓名查询一个人的信息并写在div#output中

  1. //GET 方法
  2. function search(name, fun){
  3. var xhr = new XMLHttpRequest();
  4. var url = "search.php?name=" + window.encodeURIComponent(name) + "&t=" + Math.random();
  5. xhr.open("GET", url);
  6. xhr.send();
  7. xhr.onreadystatechange = function(){
  8. if(xhr.readyState == 4 && xhr.status == 200){
  9. var data = JSON.parse(xhr.responseText); //获取了 JSON 字符串
  10. fun(data);
  11. }
  12. }
  13. }
  14. function show(data){
  15. this.innerHTML = "姓名:" + data.name + "<br />性别:" + data.gender + "<br />年龄:" + data.age + "<br />地址:" + data.address + "<br />电话:" + data.tel;
  16. }
  17. var output = document.getElementById("output");
  18. search("李华", show.bind(output));
  19. //服务器端 search.php
  20. <?php
  21. $name = $_GET[name];
  22. //模拟数据查询结果
  23. echo '{"name":"' . $name .'","age":18,"gender":"男","tel":"13211112222","address":"北京市海淀区xxxxxxxx"}';
  24. ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  1. //POST方法
  2. function search(name, fun){
  3. var xhr = new XMLHttpRequest();
  4. var url = "search.php";
  5. var para = "name=" + window.encodeURIComponent(name) + "&t=" + Math.random();
  6. xhr.open("POST", url);
  7. //POST方式下,必须把 Content-Type 设置为application/x-www-form-urlencoded
  8. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  9. xhr.onreadystatechange = function(){
  10. if(xhr.readyState == 4 && xhr.status == 200){
  11. console.log(xhr.responseText);
  12. var data = JSON.parse(xhr.responseText); //获取了 JSON 字符串
  13. fun(data);
  14. }
  15. }
  16. xhr.send(para);
  17. }
  18. function show(data){
  19. this.innerHTML = "姓名:" + data.name + "<br />性别:" + data.gender + "<br />年龄:" + data.age + "<br />地址:" + data.address + "<br />电话:" + data.tel;
  20. }
  21. var output = document.getElementById("output");
  22. search("李华", show.bind(output));
  23. //服务器端 search.php
  24. <?php
  25. $name = $_POST[name];
  26. //模拟数据查询结果
  27. echo '{"name":"' . $name .'","age":18,"gender":"男","tel":"13211112222","address":"北京市海淀区xxxxxxxx';
  28. ?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

上述代码的 jQuery 写法:

  1. //GET 方式
  2. function search(name, fun){
  3. var url = "search.php?name=" + window.encodeURIComponent(name) + "&t=" + Math.random();
  4. $.get(url, fun);
  5. }
  6. function show(data){
  7. data = JSON.parse(data);
  8. this.innerHTML = "姓名:" + data.name + "<br />性别:" + data.gender + "<br />年龄:" + data.age + "<br />地址:" + data.address + "<br />电话:" + data.tel;
  9. }
  10. var output = document.getElementById("output");
  11. search("李华", show.bind(output));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. //POST 方式
  2. function search(name, fun){
  3. var url = "search.php";
  4. var obj = {};
  5. obj.name = name;
  6. obj.t = Math.random();
  7. $.post(url, obj, fun);
  8. }
  9. function show(data){
  10. data = JSON.parse(data);
  11. this.innerHTML = "姓名:" + data.name + "<br />性别:" + data.gender + "<br />年龄:" + data.age + "<br />地址:" + data.address + "<br />电话:" + data.tel;
  12. }
  13. var output = document.getElementById("output");
  14. search("李华", show.bind(output));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Ajax常见问题

缓存问题

细心一些可以发现,上面发送请求的数据中加入了一个随机数 t。因为有时服务器更新的了数据后,我们再一次执行 Ajax 请求不能显示新的结果,这是由于 js 为了加速,页面会使用缓存保持当前调用的相同链接。我们加了一个随机数以后,每次请求不同,浏览器就不会使用缓存数据了。

中文乱码问题

返回的中文数据乱码是因为 js 页面和action页面中使用了不同的编码方式导致的。可以有以下2中方式解决(浏览器 html 文件是 urf-8 编码的): 
1. 对请求数据字段进行2次 encodeURI 编码,服务器获取数据后做一次 UTF-8 转码 
2. 对请求数据字段进行1次 encodeURI 编码,服务器获取数据后做一次 ISO-8859-1 转换 和一次 UTF-8 转码 
tips: 考虑到兼容性,第1个方法更好

兼容性问题

之前的代码并没有按兼容性的格式书写,不过 Ajax 的兼容也不难,主要表现在 XMLHTTPRequest对象获取环节:

  1. var xhr;
  2. if(XMLHttpRequest){
  3. xhr = new XMLHttpRequest(); //chrome, safari, opera, firefox
  4. } else if(ActionXObject){
  5. try{
  6. xhr = new ActionXObject("Msxml2.XMLHTTP"); //IE 中 Msxml 插件
  7. }catch(e){
  8. xhr = new ActionXObject("Microsoft.XMLHTTP"); //IE
  9. }
  10. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

GET和POST方式对比

  GET POST
后退/刷新 无害 数据会重新提交
书签 可藏为书签 无法藏为书签
缓存 可以缓存 不可以缓存
MIME类型 application/x-www-from-urlencode application/x-www-from-urlencode或 multipart/form-data (二进制为多重编码
历史记录 参数保留在历史记录中 参数不会留在历史记录
数据长度 URL最长2048个字符(2kB) 无限
数据类型 ASCII字符 无限
安全性
可见性 数据可见 数据不可见

跨域数据访问

JSONP

这里需要强调的是,jsonp不属于Ajax的部分,它只是吧url放入script标签中实现的数据传输,主要优点是不受同源策略限制。由于一般库也会把它和Ajax封装在一起,所以这里放在一起讨论。下面是一个jsonp的例子(实现功能:输入手机号码查询归属地和运营商):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>兼容问题</title>
  6. </head>
  7. <body>
  8. <form>
  9. <input type="text" name="tel" id="tel" />
  10. <input type="button" value="search" id="search"/>
  11. <br/>
  12. </form>
  13. <div id="output"></div>
  14. </body>
  15. <script>
  16. function jsonpCallback(data) {
  17. document.getElementById('output').innerHTML = data.province + " " + data.catName;
  18. }
  19. document.getElementById('search').onclick = function(){
  20. var num = document.getElementById('tel').value;
  21. if(/^1[34578]\d{9}$/.test(num)){
  22. var url = "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=" + num + "t=" + Math.random() + "&callback=jsonpCallback";
  23. var JSONP=document.createElement("script");
  24. JSONP.type="text/javascript";
  25. JSONP.src= url;
  26. document.getElementsByTagName("head")[0].appendChild(JSONP);
  27. } else {
  28. alert("您输入的手机号有误")
  29. }
  30. };
  31. </script>
  32. </html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

上述代码的全部js部分可以用jQuery实现,如下:

  1. function jsonpCallback(data) {
  2. $('#output').text(data.province + " " + data.catName);
  3. }
  4. $('#search').click(function(){
  5. var num = $('#tel').val();
  6. if(/^1[34578]\d{9}$/.test(num)){
  7. var url = "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=" + num" + "t=" + Math.random();
  8. $.ajax({
  9. url: url,
  10. type: 'GET',
  11. dataType: 'JSONP', // 处理Ajax跨域问题(本质已不是Ajax)
  12. success: function(data){
  13. $('#output').text(data.province + " " + data.catName);
  14. }
  15. });
  16. } else {
  17. alert("您输入的手机号有误")
  18. }
  19. });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

其他 Ajax 参数及方法

  • javascript
  1. //属性
  2. xhr.responseText; //从服务器返回的字符串数据
  3. xhr.responseXML; //从服务器返回的 XML 数据
  4. xhr.status; //服务器相应状态
  5. xhr.readyState; //0: 请求未初始化; 1: 已建立连接; 2: 请求已接收; 3: 请求处理中; 4: 响应已就绪
  6. xhr.timeout; //指定多少毫秒后超时,长整型
  7. xhr.upload; //获取上传进度
  8. xhr.withCredentials; //是否可以跨源,boolean 型,默认 false
  9. //方法
  10. xhr.getResponseHeader('connection'); //获取指定头信息
  11. xhr.getAllResponseHeaders(); //获全部定头信息
  12. xhr.open("METHOD", url, isAsyn); //open方法有3个参数,最后一个参数是 Boolean 型,表示是否异步,默认为 true
  13. xhr.abort(); //终止请求,置xhr.readyState为0,但不触发onreadystatechange
  14. xhr.overrideMimeType() //强制重写 http 头的 MIME 类型
  15. //事件
  16. XMLHttpRequestEventTarget.onreadystatechange //在xhr.readyState属性改变时触发
  17. XMLHttpRequestEventTarget.ontimeout //在响应超时时触发
  18. XMLHttpRequestEventTarget.onabort //当请求失败时调用该方法
  19. XMLHttpRequestEventTarget.onerror //当请求发生错误时调用该方法
  20. XMLHttpRequestEventTarget.onload //当一个HTTP请求正确加载出内容后返回时调用。
  21. XMLHttpRequestEventTarget.onloadstart //当一个HTTP请求开始加载数据时调用。
  22. XMLHttpRequestEventTarget.onloadend //当内容加载完成,不管失败与否,都会调用该方法
  23. XMLHttpRequestEventTarget.onprogress //间歇调用该方法用来获取请求过程中的信息。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

注:关于 xhr.status 可能的返回值,详见 http状态码

jQuery 中的 Ajax 方法

ajax 静态方法

  1. $.ajax({options}) //发起一个 ajax 请求
  2. options 常用以下属性设置:url, method("GET"/"POST"), crossDomain, accepts(可接受的类型), dataType, cache, contentType(编码格式), success, error
  3. $.ajaxSetup({options}); //options同上,设置 ajax 默认参数,不建议使用
  4. $.post(url, data, success, datatype); //发起一个 POST 请求 data为传递参数(可选), success(reponseText, statusText, xhr) 为成功时的回调函数(可选), datatype(xml/html/script/json/jsonp/text,可选)
  5. $.get(url, data, success, datatype); //发起一个 GET 请求, 参数同上
  6. $.getScript(url, data, success) //以 GET 请求获取一个 JS 文件并执行,参数含义同上
  7. $.getJSON(url, data, success) //以 GET 请求获取一个 JSON 字符串,参数含义同上
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ajax 动态方法

  1. $().ajaxComplete(function(){}); //注册Ajax请求完成时要调用的处理程序
  2. $().ajaxError(function(){}); //注册要在Ajax请求完成时遇到错误而调用的处理程序
  3. $().ajaxSend(function(){}); //附加要在发送Ajax请求之前执行的函数
  4. $().ajaxStart(function(){}); //注册在第一个Ajax请求开始时要调用的处理程序
  5. $().ajaxStop(function(){}); //注册要在所有Ajax请求完成后调用的处理程序
  6. $().ajaxSuccess(function(){}); //附加要在Ajax请求成功完成时执行的函数
  7. $().load(url, data, callback); //返回某 url 的数据,data为传递参数(可选), callback(reponseText, statusText, xhr) 回调函数(可选)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其他相关方法

  1. $.param(obj); //将对象转化为一个 url 参数列表
  2. $(form).serialize(); //表单数据序列化为 url 参数列表
  3. $(form).serializeArray(); //同上,但返回 JSON 串
  • 1
  • 2
  • 3

简单封装 Ajax 相关方法

简单模仿 jQuery 中 $.ajax() 方法

  1. (function(){
  2. // Ajax 选项
  3. var options = {
  4. type: "GET", //提交方式
  5. url: "", //路径
  6. params: {}, //请求参数
  7. dataType: "text", //内容类型
  8. success: function(){}, //回调函数
  9. error: function(){}
  10. };
  11. //获取 XMLHTTPRequest 对象
  12. var createRequest = function(){
  13. var xmlhttp;
  14. if(xmlhttp.XMLHttpRequest){
  15. xmlhttp = new XMLHttpRequest();
  16. }
  17. else{
  18. xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
  19. }
  20. if(xmlhttp.overrideMimeType){
  21. xmlhttp.overrideMimeType('text/xml'); //修改 MIME 类型
  22. }
  23. return xmlhttp;
  24. },
  25. // 设定 Ajax 选项
  26. var setOptions = function(newOptions){
  27. for(var prop in newOptions){
  28. if(newOptions.hasOwnProperty(prop)){
  29. this.option[prop] = newOptions[prop];
  30. }
  31. }
  32. },
  33. //格式化参数列表
  34. var formatParameters = function(){
  35. var paramsArr = [];
  36. var params = this.options.params;
  37. for(var prop in params){
  38. if(params.hasOwnProperty(prop)){
  39. paramsArr.push(prop + "=" + encodeURIComponent(params[prop]));
  40. }
  41. }
  42. return paramsArr.join('&');
  43. },
  44. //预处理并调用相应函数
  45. var readystatechange = function(xmlhttp){
  46. var returnValue;
  47. if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
  48. switch(this.options.dataType){
  49. case 'xml':
  50. returnValue = xmlhttp.responseXML;
  51. break;
  52. case 'json':
  53. returnVaue = xmlhttp.responseText;
  54. if(returnValue){
  55. returnValue = eval("(" + returnValue + ")");
  56. }
  57. break;
  58. default:
  59. returnVaue = xmlhttp.responseText;
  60. break;
  61. }
  62. if(returnValue){
  63. this.options.success(returnValue);
  64. }
  65. else{
  66. this.options.success();
  67. }
  68. } else{
  69. this.options.error();
  70. }
  71. },
  72. //发送请求,也就是$.ajax()函数
  73. var request = function(options){
  74. // var ajaxObj = this;
  75. var xmlhttp = this.createRequest();
  76. this.setOptions(options);
  77. xmlhttp.onreadystatechange = this.readystatechange.bind(null, xmlhttp);
  78. var formatParams = this.formatParameters();
  79. var type = this.options.type;
  80. var url = this.options.url;
  81. if("GET" === type.toUpperCase()){
  82. url += "?" + formatParameters;
  83. }
  84. xmlhttp.open(type, url, true);
  85. if("GET" === type.toUpperCase()){
  86. xmlhttp.send();
  87. } else if("POST" === type.toUpperCase()){
  88. xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  89. xmlhttp.send(formatParameters);
  90. }
  91. }
  92. window.$.ajax = request; //暴露方法到闭包外面去
  93. })();

ajax异步请求/同源策略/跨域传值的更多相关文章

  1. JavaScript JSON timer(计时器) AJAX HTTP请求 同源策略 跨域请求

    JSON 介绍 1. JSON: JavaScript Object Notation 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是 ...

  2. JavaScript JSON AJAX 同源策略 跨域请求

    网页和Ajax和跨域的关系 1 Ajax使网页可以动态地.异步地的与服务器进行数据交互,可以让网页局部地与服务器进行数据交互 2 Ajax强调的是异步,但是会碰到跨域的问题. 3 而有很多技术可以解决 ...

  3. jQuery异步请求(如getJSON)跨域解决方案

    相信大家在使用jQuery异步请求非自己网站内相对资源(通过别人站点上的URL直接读取)使经常会遇到如下错误吧,实际上这些错误都是浏览器安全机制“搞的鬼”,才让我们开发路上遇到了拦路虎. 当你直接在浏 ...

  4. 【手摸手,带你搭建前后端分离商城系统】02 VUE-CLI 脚手架生成基本项目,axios配置请求、解决跨域问题

    [手摸手,带你搭建前后端分离商城系统]02 VUE-CLI 脚手架生成基本项目,axios配置请求.解决跨域问题. 回顾一下上一节我们学习到的内容.已经将一个 usm_admin 后台用户 表的基本增 ...

  5. 客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法

    客户端为了实现token认证,通过Jquery的ajaxSetup方法全局配置headers: 全局配置headers后会导致部分不需要token认证的请求变为options请求,导致跨域访问.报错信 ...

  6. AJAX(XMLHttpRequest)进行跨域请求方法详解

    AJAX(XMLHttpRequest)进行跨域请求方法详解(三) 2010年01月11日 08:48:00 阅读数:24213 注意:以下代码请在Firefox 3.5.Chrome 3.0.Saf ...

  7. AJAX-同源策略 跨域访问

    ## 同源策略 概述: 同源策略是浏览器的一种安全策略,视为同源是指域名,协议,端口完全相同.只有同源的地址才可以通过AJAX方式请求.同源或者不同源说的是两个地址的关系,不同源地址之间请求我们称之为 ...

  8. Django框架12 /同源、跨域、CORS

    Django框架12 /同源.跨域.CORS 目录 Django框架12 /同源.跨域.CORS 1. 同源策略 2. 跨域 3. 解决跨域:CORS/跨域资源共享 1. 同源策略 同源策略(Same ...

  9. vue 解决axios请求出现前端跨域问题

    vue 解决axios请求出现前端跨域问题 最近在写纯前端的vue项目的时候,碰到了axios请求本机的资源的时候,出现了访问报404的问题.这就让我很难受.查询了资料原来是跨域的问题. 在正常开发中 ...

随机推荐

  1. [USACO06DEC]牛的野餐Cow Picnic DFS

    题目描述 The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ 100) cows is grazing in one of N ...

  2. ansible基本模块-cron

    ansible   XXX   -m   cron   -a   "name=‘XXX ’   job=‘执行的命令’   minute=XXX "                ...

  3. CentOS 7 安装中网络设置111

    如果在安装过程中需要使用网络,需要启动网卡,默认是DHCP 点击configure进入设置 General 常规设置 Automatically connect to this network whe ...

  4. [JLOI2015]管道连接(斯坦纳树)

    [Luogu3264] 原题解 多个频道,每个频道的关键点要求相互联通 详见代码,非常巧妙 #include<cstdio> #include<iostream> #inclu ...

  5. 打开页面时就提交,可以做一些自动登陆 还有SICLOGIN的测试代码

      <HTML> <head> <title> Untitled Document</title > (1)自动提交表单: <meta http- ...

  6. oracle五种约束的创建和移除:

    .主键约束: 创建表的时候就添加: create table table_name (categoryId varchar2(), categoryName varchar2(), primary k ...

  7. mysql远程连接详细配置

    2018-11-06 CentOS 配置MySQL允许远程登录 Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下 ...

  8. Zabbix触发器函数之count函数

    一.背景 zabbix监控中我们用的最多的是count这个函数,通过确认多次可以减少很多误告警,提高了运维效率.可以设置连续几次都异常才发出告警,这样一来,只要发出告警基本上就已经确定发生故障了. 二 ...

  9. DP Intro - OBST

    http://radford.edu/~nokie/classes/360/dp-opt-bst.html Overview Optimal Binary Search Trees - Problem ...

  10. Python归纳 | 爬虫基础知识

    1. urllib模块库 Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包: urllib.error 由urllib.request引发的异常类 urllib.pa ...