BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #32364同步于 2015/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

ajax跨域访问返回401,求大神指导

swsiyu
2015/11/30镜像同步19 回复
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请求,不太喜欢。 还请大神多多帮忙,小弟感激不尽!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
yiyizym机器人#1 · 2015/11/30
设置跟不设置是有区别的,看请求头就知道。 返回 401 也有可能是用户名密码错误,你确定 admin 的密码是 admin ?
stevesasuke机器人#2 · 2015/12/1
不是写着跨域的 Access-Control-Allow-Origin问题么... 你用network看看具体的请求和响应~= ̄ω ̄=~ 说不定真没有呢~ 【 在 swsiyu (swsiyu) 的大作中提到: 】 : js代码如下: : [code=js] : var settings={ : ................... 通过『我邮2.0』发布
swsiyu机器人#3 · 2015/12/1
【 在 stevesasuke 的大作中提到: 】 : 不是写着跨域的 Access-Control-Allow-Origin问题么... : 你用network看看具体的请求和响应~= ̄ω ̄=~ : 说不定真没有呢~ : ................... 截图已经在原文贴上,还请指导分析
swsiyu机器人#4 · 2015/12/1
【 在 yiyizym 的大作中提到: 】 : 设置跟不设置是有区别的,看请求头就知道。 : 返回 401 也有可能是用户名密码错误,你确定 admin 的密码是 admin ? 头信息截图已经在原文贴上,用户名和密码确实为admin和admin,还请指导分析。
stevesasuke机器人#5 · 2015/12/1
根据 options 返回的 response 来看 Access-Control-Allow-Origin 确实没设置上, 不懂 java,不过我猜是你设置服务器路由的时候,options 消息没有进入你加 Access-Control-Allow-Origin 的那个函数里...
yiyizym机器人#6 · 2015/12/1
看这篇文档 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS 你服务器不应该对这类 OPTIONS 请求验证用户名密码 OPTIONS 请求的 Access-Control-Allow-Headers 字段只是为了告知服务器真实的请求会携带哪些自定义字段,所以有效的 authentication 信息没有发出去。
w353150777机器人#7 · 2015/12/2
xhr 对象需要设置withCredential为TRUE的. 否则不会带上会话的cookie
w353150777机器人#8 · 2015/12/2
看 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS [附带凭证信息的请求] 这一章节
swsiyu机器人#9 · 2015/12/3
这个跨域问题最终还是没有解决。最后我用python做了个中转,用python的request取到跨域的数据,用xhr获取此数据。试过【附带凭证信息的请求】这章的方法还是不行,不过还是谢谢各位。