最近做一個微信小項目遇到一個跨域問題,就是我的前端和后端是放在不同的服務器上的,然后使用opst請求的時候
報錯。之前我是沒有了解過跨域這個問題的,然后我就上網去查了很多資料,看也很多人寫的跨域的博客,然后完成了跨域的問題。
一、什么是跨域:
跨域是指 不同域名之間相互訪問 例如 我的電腦上有2個服務器 192.168.0.11 192.168.0.12 如果第一個服務器上的頁面要訪問第二個服務器 就叫做跨域 或者http://www.baidu.com 要訪問http://www.xxx.com 也是不同域名 也是跨域 。傳統的Ajax請求只能獲取在同一個域名下面的資源,但是HTML5打破了這個限制,允許Ajax發起跨域的請求。瀏覽器是可以發起跨域請求的,比如你可以外鏈一個外域的圖片或者腳本。但是Javascript腳本是不能獲取這些資源的內容的,它只能被瀏覽器執行或渲染。主要原因還是出於安全考慮,瀏覽器會限制腳本中發起的跨站請求。跨域的解決方案有多中JSONP、Flash、Iframe等,當然還有CORS(跨域資源共享,Cross-Origin Resource Sharing)今天就來了解下CORS的原理,大家如果想了解CORS詳解可以去 http://www.ruanyifeng.com/blog/2016/04/cors.html
二、CORS瀏覽器支持情況如下圖:
因為我用的是Spring MVC,所以也是用Spring MVC做例子。
Spring MVC 從4.2版本開始增加了對CORS的支持,在spring MVC 中增加CORS支持非常簡單,可以配置全局的規則,也可以使用@CrossOrigin
注解進行細粒度的配置。
使用@CrossOrigin
注解
首先在自己Controller那里打上一個注解就可以了
@CrossOrigin(origins = "http://www.xxx", maxAge = 3600,methods={RequestMethod.POST}) @RequestMapping(value="/getPlateAll") @ResponseBody public Object getPlateAll(){ Map<String,Object> map = new HashMap<String,Object>(); List<PageData> list=null; try{ list=plateService.getPlateAll(null); }catch (Exception e){ logger.error(e.toString(),e); } map.put("list",list); return AppUtil.returnObject(new PageData(), map); }
像上面代碼塊紅色的就是跨域的注解,也可以把它寫在Controller頭上,默認情況下所有的域名和GET、HEAD和POST方法都是允許的。上面代碼塊我加了粉紅的注解大家都知道干嘛的,我把它加上顏色是因為我做的時候沒有寫上這個注解,
然后就報我404的錯誤,希望大家引以為戒。還有很多方法,我覺得這個是最方便的,所以就寫下來了。其它的還沒有時間去研究,以后有空回去研究下然后寫出來給大家看。
頁面的ajax就是平常的就行了,下面是我的簡單ajax
1 function dianzan(cid){ 2 $.ajax("http://qcdqkj.tunnel.qydev.com/qcdqkj/appthumb/thumbByUserIdandCirclesId", { 3 type: "POST", 4 data: { 5 C_ID: cid 6 }, 7 success: function() { 8 //成功10 } 11 }); 12 }