跨域问题简介

一、设置跨域模拟环境

修改:C:\Windows\System32\drivers\etc\hosts文件

DNS解析过程:hosts-->DNS Server,首先解析本地的hosts文件,hosts文件找不到的域名,则去DNS服务器进行查找。

例如我们添加了:

127.0.0.1 a.test.com

127.0.0.1 b.test.com

通过ping命令查看是否配置完成:

搭建一个spring工程,写一个jsp页面两个按钮,如图所示:

Controller代码:

@Controller  
@RequestMapping(value="/public")  
public class AjaxTestController {  
    //跳转到测试页面     
    @RequestMapping(value="/index")  
    public String toIndex(){  
        return "index";  
    }  
    //请求资源
    @RequestMapping(value="/monitorAjax")
    @ResponseBody
    public String monitorAjax(){
        String result="Ok!";
        return result;
    }
}  

jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String path=request.getContextPath();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>  
  <head>  
    <title>测试</title> 
     <link href="<%=path%>/resources/lib/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
  </head>      
  <body>  
      <div class="container">
        <div class="row" style="margin-top:50px;">
            <div class="col-md-4" style="height:100px;border:1px solid #cecece;">
                Ajax跨域模拟环境设置页面
                <button type="button" class="btn btn-primary" id="Atest">请求A资源</button>
                <button type="button" class="btn btn-primary" id="Btest">请求B资源</button>
            </div>
            <div class="col-md-8" style="height:100px;border:1px solid #cecece;"></div>
        </div>
      </div>
  <script type="text/javascript" src="<%=path%>/resources/lib/bootstrap/js/jquery.min.js"></script>
  <script type="text/javascript" src="<%=path%>/resources/lib/bootstrap/js/bootstrap.min.js"></script>
  <script type="text/javascript" src="<%=path%>/resources/js/ajaxJsonpCase.js"></script>
  <script type="text/javascript">
    var path='<%=path%>';
      $(function(){
          $("#Atest").click(function(){
              ajaxJsonpCase.AjaxATestResources();
          });
          
          $("#Btest").click(function(){
              ajaxJsonpCase.AjaxBTestResources();
          });
          
      })
  </script>
  </body> 
</html>  

js代码:

var ajaxJsonpCase={
   //在a.test.com域名下请求本域名资源 AjaxATestResources:function(){
var url=path+"/public/monitorAjax.do" $.ajax({ type:'post', url:url, data:{}, async:false, dataType: "json", success:function(data){ alert(JSON.stringify(data)); }, error:function(error){ alert(error); } }) },
//在a.test.com域名下请求b.test.com资源。 AjaxBTestResources:function(){
var url="http://b.test.com:8888/"+path+"/public/monitorAjax.do"; $.ajax({ type:'post', url:url, data:{}, async:false, dataType: "json", success:function(data){ alert(data); }, error:function(error){ alert(JSON.stringify(error)); } }) } }

测试结果:

点击A按钮:

请求成功!

点击B按钮:

报同源问题 

二、同源策略的产生

  我们知道JS可以读取/修改网页的值。

  一个浏览器中,打开一个银行网站和一个恶意网站,如果恶意网站能够对银行网站进行修改,那么就会很危险。你打开了恶意网站和另一个网站,如果没有同源限制,该恶意网站就可以构造AJAX请求频繁在另一个网站发广告帖。同源策略就是为了解决这类问题而出现的。

三、什么是同源策略(举例)

  同源策略,即拥有相同的协议(protocol),端口(如果指定),主机(域名)的两个页面是属于同一个源。

  

  然而在IE中比较特殊,IE中没有将端口号加入同源的条件中,因此上图中端口不同那一项,在IE中是算同源的.

    浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。 (白帽子讲web安全[1])

      从一个域上加载的脚本不允许访问另外一个域的文档属性。 

  注意:在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以加载跨域资源,而不受同源限制,但浏览器限制了JavaScript的权限使其不能读、写加载的内容。

       另外同源策略只对网页的HTML文档做了限制,对加载的其他静态资源如javascript、css、图片等仍然认为属于同源。

 跨域问题解决方案:代码下载

posted @ 2017-04-19 10:30  shawWey  阅读(515)  评论(0编辑  收藏  举报