关于跨域的二三事

首先说一下开发环境,服务器是IIS8,客户端应该是WebKit内核的浏览器,通过WebService通信。

简单说来,跨域问题是a.com访问b.com时出现的,为保证访问服务器的安全,阻止不同域名间对资源的请求(大概是这样吧)。因为客户端是基于本地HTML页面的,因此需要解决跨域问题才可以与服务器通信。

当跨域问题出现时,服务器一般会返回一个405错误,同时在控制台还可以看到一串英文(忘了),大意为访问被禁止。这时就要配置服务器的Response Head,在web.config文件中添加以下设置:
<system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Methods" value="GET,POST,OPTIONS" />
          <add name="Access-Control-Allow-Headers" value="Content-Type, soapaction" />
        </customHeaders>
      </httpProtocol>  
</system.webServer> 
还有
<system.web>
      <webServices>
        <protocols>
          <add name="HttpSoap" />
          <add name="HttpPost" />
          <add name="HttpGet" />
          <add name="Documentation" />
        </protocols>
      </webServices>  
</system.web>
这个据说也有用,具体没验证过。 

如果一切正常的话,在此时使用XmlHttpRequest时会出现另一个405,通过分析可以知道服务器没有配置处理OPTIONS方法。因为OPTIONS方法会返回服务器允许的方法列表,可能被用于黑客攻击,所以会被禁止。但OPTIONS是跨域传送XML所必需的,因此要配置服务器来处理OPTIONS,在IIS配置中的Handler Mapping中删掉
OPTIONSVerbHandler或者是OPTIONS,就可以允许服务器处理OPTIONS。

在web.config中再添加这么一句来处理OPTIONS:
<handlers accessPolicy="Read, Script">
 
    <add name="OPTIONS" path="*" verb="OPTIONS" modules="ProtocolSupportModule" resourceType="Unspecified" />  
</handl  ers> 
就可以传送XML了。 

另外使用XmlHttpRequest时要设置异步为false,原因未知。也可能是其他代码写错导致无法异步。 

好了先说这么多,关于跨域的具体解释以及OPTIONS还有PreFlight等有空再添加

参考:
http://blog.darkthread.net/post-2014-09-29-cors-options-preflight-and-iis.aspx
http://stackoverflow.com/questions/15584909/cors-405-method-not-allowed/15599025 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值