HTTP请求的标头中是否有任何内容可以区分AJAX调用和来自给定客户端的直接浏览器请求?用户代理字符串通常是否相同?
我想了解XMLHttpRequest如何在Javascript中工作的低级细节,但是我没有幸运地在Rhino或V8代码中找到实现代码.我对这两个项目中的代码都不熟悉,所以我可能不会找到合适的位置.
在任何地方都有可用的开源实现吗?
我试图通过拖放上传大文件.我有这段Javascript代码:
xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.setRequestHeader('X-File-Name', file.name);
xhr.setRequestHeader('X-File-Size', file.size);
xhr.setRequestHeader('Content-Type', file.type);
xhr.send(file);
Run Code Online (Sandbox Code Playgroud)
where url是一个目标url的字符串,file是一个文件拖放后检索Blob到的(根据http://www.w3.org/TR/XMLHttpRequest2/#the-send-method).此代码适用于Chrome 12,Safari 5和Firefox 4,并在HTTP请求正文中发送文件的原始内容.
但是,如果文件足够大,则永远不会发送请求.相反,XMLHttpRequest对象触发和错误事件(没有任何有用的消息).在我的环境中,此限制为86Mb,但因机器而异.
Chrome的javascript控制台显示以下消息:
POST http://localhost/xfiles/xfiles.php undefined (undefined)
Run Code Online (Sandbox Code Playgroud)
这与我的代码无关(与较小的文件完美配合).
浏览器似乎在内存中并在发送之前读取整个文件.可能有一个内存不足的异常或类似的东西会停止进程.在任何情况下,都没有发送HTTP请求,因此可以肯定服务器的限制与此问题无关.
无论如何,阅读整个文件是浪费资源.
是否有任何方法以流方式逐字节发送文件,而不必先将其存储在内存中?
我正在制作一个Chrome扩展程序,用于从我自己的服务器中提取数据.它一次使用大约4个httpRequests,但有时我会得到如下控制台错误:
XMLHttpRequest cannot load http://apps.radionsm.lv/apps/system/index.php?request=now. Origin chrome-extension://egkddfmbidfobhchndockbhjancbpfkd is not allowed by Access-Control-Allow-Origin. 对于每个人有时没有.
如果我发送header('Access-Control-Allow-Origin: *');将修复它吗?
我正在尝试使用XMLHttpRequest 2级支持进度事件来实现HTML5方式的上传进度条.
在您看到的每个示例中,方法是向progress事件添加事件侦听器,如下所示:
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = Math.round(event.loaded * 100 / event.total);
console.log(percentComplete);
}
}, false);
Run Code Online (Sandbox Code Playgroud)
这些示例似乎总是假设event.lengthComputable将为true.毕竟,浏览器肯定知道它发送的请求的长度?
无论我做什么,event.lengthComputable都是false.我已经在Safari 5.1.7和Firefox 12上测试了这两个,这两个都在OSX上.
我的网站是使用Django构建的,我在开发和生产设置上遇到了同样的问题.
我用来生成表单上传的完整代码如下所示(使用jQuery):
form.submit(function() {
// Compile the data.
var data = form.serializeArray();
data.splice(0, 0, {
name: "file",
value: form.find("#id_file").get(0).files[0]
});
// Create the form data.
var fd = new FormData();
$.each(data, function(_, item) {
fd.append(item.name, item.value);
});
// Submit the data.
var req = new XMLHttpRequest();
req.addEventListener("progress", function(event) {
if (event.lengthComputable) {
var percentComplete = …Run Code Online (Sandbox Code Playgroud) W3C是否指定XMLHttpRequest可以设置哪些HTTP头?如果是这样,他们是否出于安全原因发布了证明这些要求的文件?
是否由浏览器自行决定限制HTTP标头?如果是这样,是否有在线文档或文档集合列出了不同XHR实现的怪癖,或者是否有必要在每个实现的文档中找到该信息?
最近我一直在玩AngularJS和Java EE 6.我在Jersey上构建了一个Web服务,并在Glassfish上部署了该项目.因为我需要某种身份验证和OAuth实现或者JDBCRealm看起来有点过分,所以我决定只在用户成功登录时创建一个会话.
@POST
@Path("/login")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response login(LoginDAO loginData, @Context HttpServletRequest req) {
req.getSession().invalidate();
loginData.setPassword(PasswordGenerator.hash(loginData.getPassword()));
User foundUser = database.login(loginData);
if(foundUser == null) {
return Response.status(Status.CONFLICT).build();
}
req.getSession(true).setAttribute("username", foundUser.getUsername());
return Response.ok().build();
}
@GET
@Path("/ping")
public Response ping(@Context HttpServletRequest req) {
if(req.getSession().getAttribute("username") == null) {
return Response.ok("no session with an username attribute has been set").build();
}
return Response.ok(req.getSession(true).getAttribute("username")).build();
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,如果我从Postman发布/登录或从glassfish上部署的基本jQuery网页发送,我确实得到了正确的用户名并且已经放置了会话.如果我然后发送一个GET请求到/ ping我确实得到了我登录的用户名.
我在一个需要登录的node.js网络服务器上部署了一个AngularJS应用程序.因为这个服务器在另一个端口上,它在另一个域上,我不得不经历启用cors的痛苦.我这样做是通过构建一个容器响应过滤器来设置响应头.
public class CrossOriginResourceSharingFilter implements ContainerResponseFilter {
@Override
public ContainerResponse filter(ContainerRequest creq, ContainerResponse cresp) {
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Origin", "http://localhost:8000");
cresp.getHttpHeaders().putSingle("Access-Control-Allow-Credentials", "true"); …Run Code Online (Sandbox Code Playgroud) 我会通过使用jQuery $.ajax函数解决这个问题,但在这种情况下jQuery不是选项.相反,我将使用CORS请求.我觉得响应请求的网络服务器出了问题,我很难搞清楚问题所在.
这是我创建CORS请求的代码
var httpRequest = new XMLHttpRequest();
httpRequest.open('POST', url, true);
httpRequest.setRequestHeader( 'Access-Control-Allow-Origin', '*');
httpRequest.setRequestHeader( 'Content-Type', 'application/json' );
httpRequest.onerror = function(XMLHttpRequest, textStatus, errorThrown) {
console.log( 'The data failed to load :(' );
console.log(JSON.stringify(XMLHttpRequest));
};
httpRequest.onload = function() {
console.log('SUCCESS!');
}
Run Code Online (Sandbox Code Playgroud)
这是console.log错误:
XMLHttpRequest无法加载 http://test.testhost.com/testpage.请求标头字段Access-Control-Allow-Origin不允许使用Access-Control-Allow-Origin.
以下是标题信息:
> Remote Address:**.**.***.**:80 Request
> URL:http://test.testdomain.com/testpage Request
> Request Method:OPTIONS
> Status Code:200 OK
Run Code Online (Sandbox Code Playgroud)
请求标题:
OPTIONS /content-network HTTP/1.1
Host: test.testhost.com
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Access-Control-Request-Method: POST
Origin: http://test.testdomain.com
User-Agent: Mozilla/5.0 (Macintosh; Intel …Run Code Online (Sandbox Code Playgroud) 这是我上一个问题的后续行动
假设我有一些javascript代码,它在客户端(在浏览器中)运行良好.此代码XHR使用浏览器API 进行大量调用.
现在我想运行此代码node.js.是否在浏览器中node.js提供XHRAPI?
如何设置withCredentials=true到 fetch其回报的承诺.以下是正确的:
fetch(url,{
method:'post',
headers,
withCredentials: true
});
Run Code Online (Sandbox Code Playgroud)
我认为MDN文档谈到了关于http请求的所有内容,除非这一点:withCredentials
xmlhttprequest ×10
javascript ×8
ajax ×2
cors ×2
http-headers ×2
angularjs ×1
ecmascript-6 ×1
fetch-api ×1
http ×1
java-ee-6 ×1
jersey ×1
node.js ×1
php ×1
response ×1
rhino ×1
streaming ×1
upload ×1
v8 ×1