如果您想訂閱本博客內(nèi)容,每天自動發(fā)到您的郵箱中, 請點這里
    
    
        一、跨域科普
    
    
        跨域,即跨站HTTP請求(Cross-site HTTP request),指發(fā)起請求的資源所在域不同于請求指向資源所在域的HTTP請求。
    
    
        二、如何產(chǎn)生跨域
    
    
        當(dāng)使用前后端分離,后端主導(dǎo)的開發(fā)方式進行前后端協(xié)作開發(fā)時,常常有如下情景:
    
    
            a、后端開發(fā)完畢在服務(wù)器上進行部署并給前端API文檔。
    b、前端在本地進行開發(fā)并向遠程服務(wù)器上部署的后端發(fā)送請求。
    c、在這種開發(fā)過程中,如果前端想要一邊開發(fā)一邊測試接口,就需要使用跨域的方式。
    
    
        三、解決方案
    
    
        1、JQuery+ajax+jsonp 跨域訪問
    
Jsonp(JSON with Padding)是資料格式 json 的一種“使用模式”,可以讓網(wǎng)頁從別的網(wǎng)域獲取資料。
    
        下面給出例子:
    
    
        html 前端代碼:
    
    
        
        
            - 
                <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">    
            
- 
                <html>    
            
- 
                <head>    
            
- 
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
            
- 
                <title>Insert title here</title>    
            
- 
                <script type="text/javascript" src="resource/js/jquery-1.7.2.js"></script>    
            
- 
                </head>    
            
- 
                <script type="text/javascript">    
            
- 
                $(function(){       
            
- 
                 /*    
            
- 
                 //簡寫形式,效果相同    
            
- 
                 $.getJSON("http://app.example.com/base/json.do?sid=1494&busiId=101&jsonpCallback=?",    
            
- 
                         function(data){    
            
- 
                             $("#showcontent").text("Result:"+data.result)    
            
- 
                 });    
            
- 
                 */    
            
- 
                 $.ajax({    
            
- 
                     type : "get",    
            
- 
                     async:false,    
            
- 
                     url : "http://app.example.com/base/json.do?sid=1494&busiId=101",    
            
- 
                     dataType : "jsonp",//數(shù)據(jù)類型為jsonp    
            
- 
                     jsonp: "jsonpCallback",//服務(wù)端用于接收callback調(diào)用的function名的參數(shù)    
            
- 
                     success : function(data){    
            
- 
                         $("#showcontent").text("Result:"+data.result)    
            
- 
                     },    
            
- 
                     error:function(){    
            
- 
                         alert('fail');    
            
- 
                     }    
            
- 
                 });     
            
- 
                });    
            
- 
                </script>    
            
- 
                <body>    
            
- 
                <div id="showcontent">Result:</div>    
            
- 
                </body>    
            
- 
                </html>    
            
 
    
        服務(wù)器端:
    
    
        
        
            - 
                import java.io.IOException;    
            
- 
                import java.io.PrintWriter;    
            
- 
                import java.util.HashMap;    
            
- 
                import java.util.Map;    
            
- 
                import javax.servlet.http.HttpServletRequest;    
            
- 
                import javax.servlet.http.HttpServletResponse;    
            
- 
                import net.sf.json.JSONObject;    
            
- 
                import org.springframework.stereotype.Controller;    
            
- 
                import org.springframework.web.bind.annotation.RequestMapping;    
            
- 
                     
            
- 
                @Controller    
            
- 
                public class ExchangeJsonController {    
            
- 
                 @RequestMapping("/base/json.do")    
            
- 
                 public void exchangeJson(HttpServletRequest request,HttpServletResponse response) {    
            
- 
                    try {    
            
- 
                     response.setContentType("text/plain");    
            
- 
                     response.setHeader("Pragma", "No-cache");    
            
- 
                     response.setHeader("Cache-Control", "no-cache");    
            
- 
                     response.setDateHeader("Expires", 0);    
            
- 
                     Map<String,String> map = new HashMap<String,String>();     
            
- 
                     map.put("result", "content");    
            
- 
                     PrintWriter out = response.getWriter();         
            
- 
                     JSONObject resultJSON = JSONObject.fromObject(map);   
            
- 
                     String jsonpCallback = request.getParameter("jsonpCallback");  
            
- 
                     out.println(jsonpCallback+"("+resultJSON.toString(1,1)+")");  
            
- 
                     out.flush();    
            
- 
                     out.close();    
            
- 
                   } catch (IOException e) {    
            
- 
                    e.printStackTrace();    
            
- 
                   }    
            
- 
                 }    
            
- 
                }    
            
 
    
        2、通過注解的方式允許跨域
    
    
        在Controller類或其方法上加@CrossOrigin注解,來使之支持跨域。
    
舉例:
    
        
        
            - 
                @CrossOrigin(origins = "*", maxAge = 3600)  
            
- 
                @RestController  
            
- 
                @RequestMapping("/User")  
            
- 
                public class UserController {  
            
- 
                }  
            
 
    
        其中origins為CrossOrigin的默認參數(shù),即跨域來源,*即任何來源,也可以是其他域名。即可以以以下形式:
    
    
        
        
            - 
                @CrossOrigin("http://test.com")  
            
- 
                @CrossOrigin(origins="http://test.com",maxAge=3600)  
            
 
    
        該注解用于方法上,寫法相同,處理時,SpringMVC會對類上標簽和方法上標簽進行合并。
    
    
        3、通過配置文件的方式允許跨域
    
    
        在web.xml中添加如下配置:
    
    
        
        
            - 
                <filter-mapping>   
            
- 
                    <filter-name>CorsFilter</filter-name>   
            
- 
                    <url-pattern>/*</url-pattern>   
            
- 
                </filter-mapping>  
            
 
使用這個Filter即可讓整個服務(wù)器全局允許跨域。
    藍藍設(shè)計( www.xy78.cn )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)