我在.NET 4上有一个asp.NET WCF。这个服务用于验证用户。我们提交一个用户名和密码,然后应该返回一个包含认证cookie的HTTP头。使用本地托管的测试页,这是正常工作。我现在正在尝试访问标题信息跨域。我已将测试页面安装在不同的机器上,并配置为调用WCF。呼叫正在工作,呼叫中的“数据”回复是正确的。但是,我无法使用以下任一方式访问头信息:
alert(xmlHttp.getAllResponseHeaders());

要么

alert(xmlHttp.getResponseHeader("Set-Cookie"));

在IE中使用调试器和Firefox的“Live HTTP Header”插件,我可以看到返回的头信息。

在我的全局ajax页面中,我设置了处理CORS的响应。

private void EnableCrossDomainAjaxCall()
{
    HttpContext.Current.response.addheader("Access-Control-Allow-Origin","*");


    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {

        HttpContext.Current.response.addheader("Cache-Control","no-cache");
        HttpContext.Current.response.addheader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE");
        HttpContext.Current.response.addheader("Access-Control-Allow-Headers","Content-Type,Accept");

        HttpContext.Current.response.addheader("Access-Control-Max-Age","1728000");
        HttpContext.Current.Response.End();
    }

}

这是我用来调用该服务的AJAX:

$("#btnLogin").click(function (e) {
            var geturl;
            geturl = $.ajax({
                // type: "POST",type: "GET",contentType: "application/json; charset=utf-8",url: 'http://10.0.4.66/AuthenticationService.svc/Login?Name=test&password=pwsd',// url: '../SecurityServer/AuthenticationService.svc/Login?Name=test&password=pwsd',dataType: "jsonp",error: function (request,status,error) {
                    alert('Error Occured');
                },crossdomain: true,success: function (data,textStatus,xmlHttp) {
                    // alert(xmlHttp.getResponseHeader("Content-Type"));
                    document.write(xmlHttp.getResponseHeader("Content-Type") + "<br/>");
                    alert(xmlHttp.getAllResponseHeaders());
                    alert(xmlHttp.getResponseHeader("Set-Cookie"));
                    var headers = '';
                    var headerPair = xmlHttp.getAllResponseHeaders('wcfCookie').split("\r\n");
                    var output = '';
                    $.each(headerPair,function (key,line) {
                        var parts = line.split(':');

                        if (parts[0] == 'wcfCookie') {
                            ChocChip = parts[1]
                            return false
                        }

                    });

                }

            });

以下是我的头信息从“Live HTTP头”

Date: Mon,04 Feb 2013 12:12:40 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
Access-Control-Allow-Origin: *
Set-Cookie: wcfCookie=8D38D5D6A0F138FEB595DD016F7694EDDF3E6757C82ED3D419F5047A5294974C1885487465CEC0A0BCC2B3802C7B03FF9F5370A05D4CCBDDDABCB1558C3816044BF4F78209BF38C6B1A7CAD34CD3C85C40B8515CFB1C2B2694BC78803D8DACB4
Content-Length: 65
Cache-Control: application/json; charset=utf-8
Content-Type: application/x-javascript

解决方法

首先,有一点背景:

您正在使用Access-Control-Allow-Headers,它指定客户端允许发送哪些请求头,但是您没有指定客户端可以读取哪些响应头。要允许客户端读取非简单的响应头,您需要使用Access-Control-Expose-Headers。从HTML5 Rocks CORS page:

During a CORS request,the getResponseHeader() method can only access simple response headers. Simple response headers are defined as follows:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

If you want clients to be able to access other headers,you have to use the Access-Control-Expose-Headers header. The value of this header is a comma-delimited list of response headers you want to expose to the client.

所以,考虑到新的信息,你可能会这样做:

HttpContext.Current.response.addheader("Access-Control-Expose-Headers","Set-Cookie");

…但是还有更多的。

现在,实际答案:

这里还有一个更严重的问题:XHR规范explictily disallows reading Set-Cookie.这是因为这在功能上是跨域Cookie窃取攻击。

假设域A对域B进行跨域请求。域B设置cookie时,只为域B设置域特定的cookie。域A读取域B的cookie的任何尝试都违反了Cookie访问的同源策略。

我不知道WCF,所以我不是确定最好的方式来实际做你想要的,但是我猜想解决方案可能是通过cookie传递auth令牌(例如,X-WCF-Auth标题?)域A读取然后设置自己的cookie。

jquery – xmlHttp.getResponseHeader不适用于CORS的更多相关文章

  1. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  4. ios – 如何在Swift中手动为UIWebView设置Cookie

    我需要在swift中为webview设置一个cookie.我找到了一个解决方案,但它是针对objective-c的.如何在Swift中做到这一点?

  5. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  6. 通过在iOS中处理cookie来维护会话信息

    我是iOS开发的新手.我正在使用NSURLSession来管理会话信息.下面是我用来调用任何服务器API的示例代码,我的申请流程是,如果没有登录–>登录(呼叫登录api)Else转到主屏幕并调用其他API.我的问题是,一旦从内存中删除应用程序,会话信息就不会被维护,我不得不再次调用Login.我的要求就像Facebook一样,用户只需登录一次,并且在下次应用程序启动时保持会话.编辑:我想我必须通过

  7. ios – 以http无效的自定义URL方案开头

    我在应用程序中使用了自定义URL方案.我成功地从safari重定向到我的应用程序.就像我已经制作了URL方案“appname”.请检查http://prntscr.com/2cjx0p.我需要使用像iosurlredirectfrommailtoapp这样的解决方案,但我不确定如何设置cookie.我发现我必须首先在我的应用程序中为服务器“http://myappname.com”设置一个cook

  8. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  9. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  10. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

随机推荐

  1. jquery-plugins – 是否可以使用猫头鹰旋转木马实现循环/无限轮播?

    我正在使用猫头鹰旋转木马,它的工作完美,除了它不支持循环/无限滚动.我没有搜索google和stackoverflow的想法,没有运气.有没有人在猫头鹰旋转木马上实现圆形/无限滚动?

  2. jQuery动态输入字段焦点

    我想使用以下jQuery向我的页面动态添加一个输入字段:在这样做之后,我希望输入字段具有闪烁的文本光标的焦点,所以我想在创建后立即输入.有人可以告诉我我该怎么办?

  3. jquery – 为什么$(window).height()这样错了?

    我试图获取当前浏览器的视口高度,使用但我得到的价值观太低了.当视口高度高达850px时,我从height()获取大约350或400像素的值.这是怎么回事?

  4. jquery – 如果在此div之外和其他draggables内部(使用无效和有效的还原选项),则可拖动恢复

    例如这样但是由于明显的原因,这不行.我可以说这个吗?

  5. 创建一个jQueryUI 1.8按钮菜单

    现在jQueryUI1.8已经出来了,我正在浏览更新,并且遇到了新的Buttonwidget,特别是SplitButtonwithadropdown的演示之一.这个演示似乎表明Buttonwidget可以在这里创建一个下拉菜单.作为讨论的问题,我想知道使用这个新的Button小部件来创建一个下拉菜单有什么方法.干杯.解决方法您必须在按钮下方列出一个列表,方式类似于此处为自动完成提供的演示:http

  6. 灰色divs使用JQuery

    我试图使用这个代码:为了淡出一大堆名为MySelectorDiv的div,唯一的是,它只会淡出第一个而不是所有的div,为什么呢?

  7. 使用jQuery动态插入到列表中

    我有两个订单列表在彼此旁边.当我从一个列表中选出一个节点时,我想按照字母顺序插入到另一个列表中.抓住的是我想要把一个元素放在另一个列表中,而不刷新整个列表.奇怪的是,当我插入到右边的列表中,它工作正常,但是当我插入到左边的列表中时,顺序永远不会出来.我也尝试将所有内容读入数组,并将其排序在一起,以防止children()方法没有按照显示顺序返回任何东西,但是我仍然得到相同的结果.这是我的jQuer

  8. 没有回应MediaWiki API使用jQuery

    我试图从维基百科获取一些内容作为JSON:但我没有回应.如果我粘贴到浏览器的地址栏,就像我得到预期的内容.怎么了?解决方法您需要通过添加&callback=?来触发具有$.getJSON()的JSONP行为?在querystring上,像这样:Youcantestithere.没有使用JSONP,你正在击中same-originpolicy,阻止XmlHttpRequest获取任何数据.

  9. jQuery Ajax请求每30秒

    我有这段代码,但是有些人在我的网站上的值可能会改变.我需要每30秒钟更新一次#financediv.这可以做吗解决方法您可以将代码放在单独的函数中,如下所示:然后每30秒建立一个定时器调用该函数:祝你好运!总结以上是DEVMAX为你收集整理的jQueryAjax请求每30秒全部内容。如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  10. jquery – keypress事件在IE和Chrome中不工作,但在FF工作

    任何想法为什么会这样发生?我通常认为Chrome会更加宽容代码?这是我的按键键.我错过了什么吗?右图();和leftimage();是应该工作的功能,因为我在其他地方使用这些功能谢谢您的帮助!

返回
顶部