返回信息流js代码如下:
var settings={
url: 'http://192.168.80.129:8080/status',
type: "POST",
data: { "id" : "1" },
contentType:"application/json",
dataType: "application/json",
beforeSend:function(request){
//request.setRequestHeader("Authorization","Basic YWRtaW46YWRtaW4=");
request.setRequestHeader("Authentication","Basic YWRtaW46YWRtaW4=");
},
success: function(data){
console.log(data);
},
error:function(data){
console.log(data);
},
headers: {
//"Content-Type":"application/json-rpc",
//"Authorization":"YWRtaW46YWRtaW4="
}
}
$.ajax(settings);
注释和非注释的都试过,返回结果一样
后端是Jetty服务器,关键代码
/**
* Writes json object.
*
* @param response
* the response
* @param jresp the JSON response
* @throws IOException
* Signals that an I/O exception has occurred.
*/
protected void writeJSONObject(final HttpServletResponse response,
final JSONRPC2Response jresp) throws IOException {
response.setStatus(HttpServletResponse.SC_OK);
response.setHeader("Content-Type", "application/json; charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization,Accept,X-Requested-With");
response.setContentType("application/json; charset=utf-8");
final String json = jresp.toJSONString();
AbstractService.log.debug("---------JSON RPC response: {}", json);
response.getWriter().println(json);
}
已经设置Access-Control-Allow-Origin
返回结果如下图
跨域时,在post请求发送前浏览器会先发送options请求来询问服务器。在服务器端是需要用户名密码验证的。现在我不明白的是为什么在options时就被否决。options应该只是验证域吧,难道还有用户名和密码的验证吗。有人说跨域时设置的request.setRequestHeader("Authorization","Basic YWRtaW46YWRtaW4=")不起作用。我把所用的有关头信息设置注释后返回的错误和没有注释是一样的,可见在这里设置的请求头确实没起作用。
已经尝试过jsonp的方法,不过只能发送Get请求,不太喜欢。
还请大神多多帮忙,小弟感激不尽!
这是一条镜像帖。来源:北邮人论坛 / www-technology / #32364同步于 2015/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖
ajax跨域访问返回401,求大神指导
swsiyu
2015/11/30镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不是写着跨域的 Access-Control-Allow-Origin问题么...
你用network看看具体的请求和响应~= ̄ω ̄=~
说不定真没有呢~
【 在 swsiyu (swsiyu) 的大作中提到: 】
: js代码如下:
: [code=js]
: var settings={
: ...................
通过『我邮2.0』发布
【 在 stevesasuke 的大作中提到: 】
: 不是写着跨域的 Access-Control-Allow-Origin问题么...
: 你用network看看具体的请求和响应~= ̄ω ̄=~
: 说不定真没有呢~
: ...................
截图已经在原文贴上,还请指导分析
【 在 yiyizym 的大作中提到: 】
: 设置跟不设置是有区别的,看请求头就知道。
: 返回 401 也有可能是用户名密码错误,你确定 admin 的密码是 admin ?
头信息截图已经在原文贴上,用户名和密码确实为admin和admin,还请指导分析。
根据 options 返回的 response 来看 Access-Control-Allow-Origin 确实没设置上,
不懂 java,不过我猜是你设置服务器路由的时候,options 消息没有进入你加 Access-Control-Allow-Origin 的那个函数里...
看这篇文档 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
你服务器不应该对这类 OPTIONS 请求验证用户名密码
OPTIONS 请求的 Access-Control-Allow-Headers 字段只是为了告知服务器真实的请求会携带哪些自定义字段,所以有效的 authentication 信息没有发出去。
看 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS [附带凭证信息的请求] 这一章节
这个跨域问题最终还是没有解决。最后我用python做了个中转,用python的request取到跨域的数据,用xhr获取此数据。试过【附带凭证信息的请求】这章的方法还是不行,不过还是谢谢各位。