建立

两个Wsgi服务器在不同端口上本地运行.一台服务器返回一个包含javascript的html页面,该页面使用jQuery对另一个Wsgi服务器执行跨源ajax请求.

origin_server.py在http:// localhost:9010提供html.

#!/usr/bin/env python

from wsgiref.simple_server import make_server


def origin_html(environ,start_response):
    status = '200 OK'
    response_headers = [('Content-Type','text/html')]
    start_response(status,response_headers)    

    f = open('./index.html','rb')
    return [f.read()]

httpd = make_server('localhost',9010,origin_html)
httpd.serve_forever()

cors_server.py提供javascript将请求的跨源资源.

#!/usr/bin/env python

from wsgiref.simple_server import make_server
import json


def cors_json(environ,start_response):
    status = '200 OK'
    response_headers = [
        ('Content-Type','application/json'),('Access-Control-Allow-Origin','*')
    ]
    start_response(status,response_headers)

    return [json.dumps({'foo': 'bar'})]

httpd = make_server('localhost',9011,cors_json)
httpd.serve_forever()

index.html由origin_sever.py提供的页面.

<!DOCTYPE html>
<html>
    <head>
        <script
            type="text/javascript"
            src="https://code.jquery.com/jquery-2.1.3.min.js"
            >
        </script>

        <script type="text/javascript">
            $(document).ready(function () { 
                console.log('Doing the thing.');
                $.get('http://localhost:9011').done(function (data) {
                    console.log('Got the thing',data);
                });
            });
        </script>
    </head>
    <body>
        Beep boop.
    </body>
</html>

github上面的代码在这里:https://github.com/thatjpk/local-wsgi-cors-ajax

供参考的东西版本:

> 2012年中期MacBook Pro,OS X 10.10
> Python 2.7.6
> wsgiref 0.1.2
> Chrome 40.0.2214.93(已禁用扩展程序并重置设置以进行测试.)
> Firefox 35.0.1

问题

鉴于上述情况,我可以打开两个终端,在一个中启动origin_server.py,在另一个中启动cors_server.py,然后打开浏览器选项卡并将其指向http:// localhost:9010 /的源服务器.这会加载页面,并执行跨源请求.

理想情况下,延迟应该都非常低,因为它都是本地的.但是,我一直看到超过十秒的跨源请求的延迟.什么是bizzarre我只是在Chrome中的非隐身窗口中看过这个.同一台计算机上的Firefox,curl,httpie和Chrome隐身标签都可以在10毫秒内完成跨源请求,而非隐身Chrome标签则需要三个数量级.

如果我将CORS排除在等式之外,只需将http:// localhost:9011放入Chrome地址栏,json就会立即加载到视图中.这显然只有在请求来自javascript时才会发生.

如果在Chrome中对它的请求为“待处理”时尝试向cors_server.py发出另一个请求,则第二个请求将等到第一个请求完成时.这意味着在执行到达cors_server.py中的处理程序之前,第一个请求以某种方式将wsgi服务器占用了很长时间.

当请求永远完成时,肯定会有更多的事情发生.我使用tcpdump -i lo0 dst端口9011或src端口9011收集了以下内容.

这是来自httpie(http get localhost:9011)的请求,可以快速完成.

17:33:57.176028 IP localhost.64723 > localhost.9011: Flags [S],seq 2244357563,win 65535,options [mss 16344,nop,wscale 5,TS val 910553864 ecr 0,sackOK,eol],length 0
17:33:57.176089 IP localhost.9011 > localhost.64723: Flags [S.],seq 1494086712,ack 2244357564,TS val 910553864 ecr 910553864,length 0
17:33:57.176103 IP localhost.64723 > localhost.9011: Flags [.],ack 1,win 12759,options [nop,TS val 910553864 ecr 910553864],length 0
17:33:57.176113 IP localhost.9011 > localhost.64723: Flags [.],length 0
17:33:57.176145 IP localhost.64723 > localhost.9011: Flags [P.],seq 1:136,length 135
17:33:57.176158 IP localhost.9011 > localhost.64723: Flags [.],ack 136,win 12755,length 0
17:33:57.176760 IP localhost.9011 > localhost.64723: Flags [P.],seq 1:18,length 17
17:33:57.176781 IP localhost.64723 > localhost.9011: Flags [.],ack 18,win 12758,length 0
17:33:57.176811 IP localhost.9011 > localhost.64723: Flags [P.],seq 18:55,length 37
17:33:57.176823 IP localhost.64723 > localhost.9011: Flags [.],ack 55,win 12757,length 0
17:33:57.176834 IP localhost.9011 > localhost.64723: Flags [P.],seq 55:92,length 37
17:33:57.176844 IP localhost.64723 > localhost.9011: Flags [.],ack 92,win 12756,length 0
17:33:57.176857 IP localhost.9011 > localhost.64723: Flags [P.],seq 92:178,length 86
17:33:57.176866 IP localhost.64723 > localhost.9011: Flags [.],ack 178,win 12753,length 0
17:33:57.176878 IP localhost.9011 > localhost.64723: Flags [P.],seq 178:192,length 14
17:33:57.176886 IP localhost.64723 > localhost.9011: Flags [.],ack 192,length 0
17:33:57.176961 IP localhost.9011 > localhost.64723: Flags [F.],seq 192,TS val 910553865 ecr 910553864],length 0
17:33:57.176975 IP localhost.64723 > localhost.9011: Flags [.],ack 193,TS val 910553865 ecr 910553865],length 0
17:33:57.176980 IP localhost.9011 > localhost.64723: Flags [.],length 0
17:33:57.182034 IP localhost.64723 > localhost.9011: Flags [F.],seq 136,TS val 910553870 ecr 910553865],length 0
17:33:57.182095 IP localhost.9011 > localhost.64723: Flags [.],ack 137,TS val 910553870 ecr 910553870],length 0

这是来自Firefox的请求,可以快速完成.

18:12:57.416741 IP localhost.65089 > localhost.9011: Flags [S],seq 2202457533,TS val 912890306 ecr 0,length 0
18:12:57.416794 IP localhost.9011 > localhost.65089: Flags [S.],seq 1807873905,ack 2202457534,TS val 912890306 ecr 912890306,length 0
18:12:57.416806 IP localhost.65089 > localhost.9011: Flags [.],TS val 912890306 ecr 912890306],length 0
18:12:57.416818 IP localhost.9011 > localhost.65089: Flags [.],length 0
18:12:57.416883 IP localhost.65089 > localhost.9011: Flags [P.],seq 1:346,length 345
18:12:57.416899 IP localhost.9011 > localhost.65089: Flags [.],ack 346,win 12748,length 0
18:12:57.417478 IP localhost.9011 > localhost.65089: Flags [P.],length 17
18:12:57.417492 IP localhost.65089 > localhost.9011: Flags [.],length 0
18:12:57.417516 IP localhost.9011 > localhost.65089: Flags [P.],length 37
18:12:57.417538 IP localhost.65089 > localhost.9011: Flags [.],length 0
18:12:57.417548 IP localhost.9011 > localhost.65089: Flags [P.],length 37
18:12:57.417555 IP localhost.65089 > localhost.9011: Flags [.],length 0
18:12:57.417562 IP localhost.9011 > localhost.65089: Flags [P.],seq 92:192,length 100
18:12:57.417569 IP localhost.65089 > localhost.9011: Flags [.],length 0
18:12:57.417618 IP localhost.9011 > localhost.65089: Flags [F.],length 0
18:12:57.417629 IP localhost.65089 > localhost.9011: Flags [.],length 0
18:12:57.417634 IP localhost.9011 > localhost.65089: Flags [.],length 0
18:12:57.417638 IP localhost.65089 > localhost.9011: Flags [F.],seq 346,length 0
18:12:57.417647 IP localhost.9011 > localhost.65089: Flags [.],ack 347,length 0

这是来自Chrome隐身标签的请求,可以快速完成.

17:28:10.096905 IP6 localhost.64691 > localhost.9011: Flags [S],seq 2861078667,options [mss 16324,TS val 910207638 ecr 0,length 0
17:28:10.096926 IP6 localhost.9011 > localhost.64691: Flags [R.],seq 0,ack 2861078668,win 0,length 0
17:28:10.097010 IP localhost.64692 > localhost.9011: Flags [S],seq 3615577823,length 0
17:28:10.097056 IP localhost.9011 > localhost.64692: Flags [S.],seq 3533709271,ack 3615577824,TS val 910207638 ecr 910207638,length 0
17:28:10.097066 IP localhost.64692 > localhost.9011: Flags [.],TS val 910207638 ecr 910207638],length 0
17:28:10.097075 IP localhost.9011 > localhost.64692: Flags [.],length 0
17:28:10.097274 IP localhost.64692 > localhost.9011: Flags [P.],seq 1:373,length 372
17:28:10.097293 IP localhost.9011 > localhost.64692: Flags [.],ack 373,win 12747,length 0
17:28:10.098108 IP localhost.9011 > localhost.64692: Flags [P.],TS val 910207639 ecr 910207638],length 17
17:28:10.098131 IP localhost.64692 > localhost.9011: Flags [.],TS val 910207639 ecr 910207639],length 0
17:28:10.098166 IP localhost.9011 > localhost.64692: Flags [P.],length 37
17:28:10.098184 IP localhost.64692 > localhost.9011: Flags [.],length 0
17:28:10.098212 IP localhost.9011 > localhost.64692: Flags [P.],length 37
17:28:10.098232 IP localhost.64692 > localhost.9011: Flags [.],length 0
17:28:10.098246 IP localhost.9011 > localhost.64692: Flags [P.],length 86
17:28:10.098267 IP localhost.64692 > localhost.9011: Flags [.],length 0
17:28:10.098277 IP localhost.9011 > localhost.64692: Flags [P.],length 14
17:28:10.098283 IP localhost.64692 > localhost.9011: Flags [.],length 0
17:28:10.098352 IP localhost.9011 > localhost.64692: Flags [F.],length 0
17:28:10.098369 IP localhost.64692 > localhost.9011: Flags [.],length 0
17:28:10.098380 IP localhost.9011 > localhost.64692: Flags [.],length 0
17:28:10.099183 IP localhost.64692 > localhost.9011: Flags [F.],seq 373,TS val 910207640 ecr 910207639],length 0
17:28:10.099217 IP localhost.9011 > localhost.64692: Flags [.],ack 374,TS val 910207640 ecr 910207640],length 0

这是来自常规Chrome标签的请求,耗时约为18秒.

17:28:27.147218 IP6 localhost.64699 > localhost.9011: Flags [S],seq 1481186887,TS val 910224643 ecr 0,length 0
17:28:27.147230 IP6 localhost.9011 > localhost.64699: Flags [R.],ack 1481186888,length 0
17:28:27.147277 IP6 localhost.64700 > localhost.9011: Flags [S],seq 1928824698,length 0
17:28:27.147287 IP6 localhost.9011 > localhost.64700: Flags [R.],ack 1928824699,length 0
17:28:27.147331 IP6 localhost.64701 > localhost.9011: Flags [S],seq 63463797,length 0
17:28:27.147340 IP6 localhost.9011 > localhost.64701: Flags [R.],ack 63463798,length 0
17:28:27.147578 IP localhost.64704 > localhost.9011: Flags [S],seq 2185396531,length 0
17:28:27.147602 IP localhost.64705 > localhost.9011: Flags [S],seq 2307844059,length 0
17:28:27.147617 IP localhost.9011 > localhost.64704: Flags [S.],seq 4199967470,ack 2185396532,TS val 910224643 ecr 910224643,length 0
17:28:27.147627 IP localhost.64706 > localhost.9011: Flags [S],seq 324888549,length 0
17:28:27.147638 IP localhost.9011 > localhost.64705: Flags [S.],seq 1097272416,ack 2307844060,length 0
17:28:27.147643 IP localhost.64704 > localhost.9011: Flags [.],TS val 910224643 ecr 910224643],length 0
17:28:27.147665 IP localhost.9011 > localhost.64706: Flags [S.],seq 837656804,ack 324888550,length 0
17:28:27.147669 IP localhost.64705 > localhost.9011: Flags [.],length 0
17:28:27.147675 IP localhost.9011 > localhost.64704: Flags [.],length 0
17:28:27.147681 IP localhost.64706 > localhost.9011: Flags [.],length 0
17:28:27.147686 IP localhost.9011 > localhost.64705: Flags [.],length 0
17:28:27.147691 IP localhost.9011 > localhost.64706: Flags [.],length 0
17:28:27.243730 IP6 localhost.64708 > localhost.9011: Flags [S],seq 4213763930,TS val 910224733 ecr 0,length 0
17:28:27.243748 IP6 localhost.9011 > localhost.64708: Flags [R.],ack 4213763931,length 0
17:28:27.243855 IP localhost.64709 > localhost.9011: Flags [S],seq 1721904940,length 0
17:28:27.243910 IP localhost.9011 > localhost.64709: Flags [S.],seq 2521348026,ack 1721904941,TS val 910224733 ecr 910224733,length 0
17:28:27.243925 IP localhost.64709 > localhost.9011: Flags [.],TS val 910224733 ecr 910224733],length 0
17:28:27.243934 IP localhost.9011 > localhost.64709: Flags [.],length 0
17:28:27.244093 IP localhost.64709 > localhost.9011: Flags [P.],seq 1:390,length 389
17:28:27.244108 IP localhost.9011 > localhost.64709: Flags [.],ack 390,length 0
17:28:45.693569 IP localhost.64704 > localhost.9011: Flags [F.],seq 1,TS val 910243145 ecr 910224643],length 0
17:28:45.693596 IP localhost.64705 > localhost.9011: Flags [F.],length 0
17:28:45.693605 IP localhost.64706 > localhost.9011: Flags [F.],length 0
17:28:45.693627 IP localhost.9011 > localhost.64704: Flags [.],ack 2,TS val 910243145 ecr 910243145],length 0
17:28:45.693636 IP localhost.9011 > localhost.64705: Flags [.],length 0
17:28:45.693645 IP localhost.9011 > localhost.64706: Flags [.],length 0
17:28:45.693655 IP localhost.64704 > localhost.9011: Flags [.],length 0
17:28:45.693661 IP localhost.64705 > localhost.9011: Flags [.],length 0
17:28:45.693666 IP localhost.64706 > localhost.9011: Flags [.],length 0
17:28:45.693737 IP localhost.9011 > localhost.64704: Flags [F.],length 0
17:28:45.693766 IP localhost.64704 > localhost.9011: Flags [.],length 0
17:28:45.693862 IP localhost.9011 > localhost.64705: Flags [F.],length 0
17:28:45.693909 IP localhost.64705 > localhost.9011: Flags [.],length 0
17:28:45.693935 IP localhost.9011 > localhost.64706: Flags [F.],length 0
17:28:45.693949 IP localhost.64706 > localhost.9011: Flags [.],length 0
17:28:45.694861 IP localhost.9011 > localhost.64709: Flags [P.],TS val 910243146 ecr 910224733],length 17
17:28:45.694886 IP localhost.64709 > localhost.9011: Flags [.],TS val 910243146 ecr 910243146],length 0
17:28:45.694937 IP localhost.9011 > localhost.64709: Flags [P.],length 37
17:28:45.694958 IP localhost.64709 > localhost.9011: Flags [.],length 0
17:28:45.694971 IP localhost.9011 > localhost.64709: Flags [P.],length 37
17:28:45.694982 IP localhost.64709 > localhost.9011: Flags [.],length 0
17:28:45.694997 IP localhost.9011 > localhost.64709: Flags [P.],length 86
17:28:45.695009 IP localhost.64709 > localhost.9011: Flags [.],length 0
17:28:45.695016 IP localhost.9011 > localhost.64709: Flags [P.],length 14
17:28:45.695020 IP localhost.64709 > localhost.9011: Flags [.],length 0
17:28:45.695087 IP localhost.9011 > localhost.64709: Flags [F.],length 0
17:28:45.695111 IP localhost.64709 > localhost.9011: Flags [.],length 0
17:28:45.695120 IP localhost.9011 > localhost.64709: Flags [.],length 0
17:28:45.696046 IP localhost.64709 > localhost.9011: Flags [F.],seq 390,TS val 910243147 ecr 910243146],length 0
17:28:45.696069 IP localhost.9011 > localhost.64709: Flags [.],ack 391,TS val 910243147 ecr 910243147],length 0

看起来Chrome首先尝试IPv6,而wsgiref不喜欢.所以连接重置服务器发送有意义.

对于非隐身Chrome浏览器,似乎客户端会进行多次连接尝试.服务器重置前几次尝试,然后接受一些,然后只使用其中一个连接,客户端实际发送请求.我假设因为wsgiref.simple_server是单线程的,所以之前的连接必须超时才能使得实际请求得到处理;因此延迟.

有趣的是,即使隐身Chrome仍然会重置,但只有它只重试一次,然后按预期工作. Firefox和httpie都只建立一个运行顺畅的单一连接.

问题

>为什么Chrome会尝试为单个请求打开这么多连接?
> Chrome的隐身模式会让它表现得更加愉快,在这里?
>这是……一个错误吗? (在Chrome或wsgiref中?)

解决方法

tl; dr:Chrome进行了过于激进的优化.新闻11.

事实证明这是因为Chrome的“优化”可以加快页面加载,API交互等.

Chrome有一个名为“预测网络操作以提高网页加载效果”的设置. (在高级设置中它处于隐私状态.)启用此选项后,即使在客户端代码到达执行点之前,Chrome也会抢先打开与主机上资源的服务器的TCP连接,这将告诉浏览器发出HTTP请求.

在这种情况下,Chrome发现我将向CORS服务器发出一个AJAX请求,并打开多个与服务器的TCP连接,以便为我稍后可能提出的其他HTTP请求做准备(即使我的javascript只会发出一个请求)到服务器).它显然在连接之前打开这些额外的连接,实际上将携带javascript将发出的一个HTTP请求.这意味着对于单线程服务器,这些附加连接必须超时才能提供将承载请求的连接.这是延迟的来源.

默认情况下启用“预测网络操作以提高页面加载性能”设置,并且在隐身时处于非活动状态(可能是因为它将用户的行为泄露给可能或可能实际上不会获得请求的服务器).在此方案中,禁用它可防止打开这些额外连接,Chrome的行为与Firefox完全相同.

这让我想知道Chrome在互联网上的生产服务器上打开了多少TCP连接,这些连接要么在使用之前未使用,要么在发送请求之前保持打开一段时间.未使用的连接甚至不会显示在访问日志中,因为没有发出HTTP请求,因此很难估计Chrome用户创建了多少额外负载.在我看来,这种行为是有害的.首先,因为它试图提高客户端性能(这是令人钦佩的),但这样做是以服务器操作符为代价的(不是).第二,因为(因为它被隐姓埋名而被忽视)具有负面的隐私含义.

javascript – 对Chrome中的本地WSGI服务器的CORS AJAX请求过度延迟的更多相关文章

  1. ios – 尝试向我们分配IP而不是localhost或home时,NSURLSession失败

    我有一台本地运行的服务器(我的IP是192.168.0.98),并且已经尝试使用一些网络代码来访问它.最初这是通过AFNetworking完成的,但我现在用这样的NSURLSession完成了它:然后我用这3个URL运行它:>http://localhost:8080/api–>作品.>http://127.0.0.1:8080/api–>作品.>http://192.168.0.98:8080/

  2. iOS Chrome上的HTML SELECT不显示“完成”选项

    我们在iOS上的Chrome中使用UI呈现时遇到问题,特别是HTMLSELECTDropDown元素.例:使用Safari,当您点击SELECT时,屏幕底部会打开一个微调器–您可以点击完成以选择您的选择并返回到表单.但是,当您在iOS上的Chrome中加载完全相同的页面时,不会显示“完成”.用户必须选择他们的选择,然后点击UI上的其他位置返回到表单.非常不直观,用户感觉好像SELECT没有用.有人有解决方案吗?

  3. 有任何方法可以在任何IOS设备中调试chrome

    有没有办法在IOS设备上调试Chrome浏览器?如果没有办法,我可以如何处理ios上的chrome错误?

  4. ios – 为什么Google Chrome模拟器以375×667的分辨率显示iPhone 6?

    我正在以编程方式调整我的网站的图像尺寸不同大小的设备.但现在我无法告诉我实际需要什么尺寸.在GoogleChrome模拟器中,我看到我的某些图像有所增加,例如在iPhone6从230×230自然到357×357显示.该图像几乎占据了仿真屏幕的整个宽度,并且看起来稍微退化,这表明iPhone6的宽度不会大于357像素.但是ApplesaysiPhone6的分辨率是750×1334!为什么某些来源的供应尺寸是Chrome模拟器所说的两倍?

  5. iOS 10.3:模拟器HTTPS localhost:SSL错误

    这适用于iOS10.2及更低版本,但升级到10.3后,当模拟器尝试通过HTTPS连接到运行在localhost上的开发服务器时,Xcode控制台会输出以下错误:打印出URLSessionDataTask返回的错误显示:参考:Apple:Developer:GuidesandSampleCode:TechnicalNoteTN2232:HTTPSServerTrustEvaluation要创建自签名

  6. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  7. KeyStone安装部署笔记

    KeyStone客户端:OpenStack身份服务API的命令行接口。OpenStack出于扩展性的考虑也支持多个region。下面的命令在regionOne创建了keystone的三种端点:为admin租户和用户申请令牌:最后验证admin租户和用户:输出结果验证了身份服务工作正常,Keystone安装部署成功。

  8. openstack swift和wsgi源码分析1 HTTP请求处理过程

    分析proxy-server代理服务的执行流程,其他的三个主要服务accountserver,containerserver,objectserver执行过程通proxyserver类似。入口函数调用run_wsgi,此函数完成以下工作:下面重点研究下process_request函数是如何把消息转化为HTTP的request对象这一过程。process_request函数,生成HttpProtocol对象,并执行init操作,注意,HttpProtocol对象自身没有init函数,所以会调用父类的父类的

  9. openstack swift和wsgi源码分析2 eventlet HTTP协议解析过程中rfile工作原理

    研究rfile如何解析消息头和消息正文,并返回结果的过程。rfile和wfile根据client_socket由HttpProtocal类的setup函数生成。生成流程,如下代码:defserver():defprocess_request:classBaseRequestHandler:classHttpProtocol其中sock由eventlet所重写的listen函数生成,基于eventlet.greenio模块的GreenSocket类。最终消息头数据存储在self.environ变量中,消息正

  10. android – 使用Dart进行远程调试

    这个问题的动机是,我花了大约两个小时来找出我做错了什么.如何在我的Android手机或模拟器上远程调试我的Dart-Webapp?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部