跨域问题解决办法

来源:互联网 发布:阿里云销售面试流程 编辑:程序博客网 时间:2024/05/09 04:15

跨域问题

1. 设置Access-Control-Allow-Origin
服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。通过设置Access-Control-Allow-Origin来实现跨域访问比较简单。
例如:
客户端的域名是www.client.com,而请求的域名是www.server.com
如果直接使用ajax访问,会有以下错误

XMLHttpRequest cannot load http://www.server.com/server.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.client.com' is therefore not allowed access.

修改被请求的Response header

  • java
response.setHeader("Access-Control-Allow-Origin", "*");
添加位置可以在下面三处任选一个。(1)可以在过滤器 filter 中的 dofilter() 方法设置。(2)可以在 servlet 的 get 或者 post 方法里面设置。(3)可以放在访问的 jsp 页面第一行。
  • PHP
// 指定允许其他域名访问  header('Access-Control-Allow-Origin:*');  // 响应类型  header('Access-Control-Allow-Methods:POST');  // 响应头设置  header('Access-Control-Allow-Headers:x-requested-with,content-type');  

2. JSONP

3. document.domain
将子域和主域的document.domain设为同一个主域。前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域。

  • 在页面 http://www.example.com/a.html 中设置document.domain:
<script type="text/javascript">    document.domain = 'example.com';//设置成主域    function test(){        alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象    }</script>
  • 在页面 http://example.com/b.html 中也设置document.domain:
<script type="text/javascript">    document.domain = 'example.com';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同</script>

4. window.name
window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的

5. window.postMessage
window.postMessage(message,targetOrigin) 方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

原创粉丝点击