JQuery ajax 與java TOMCAT實現跨域資源共享(CORS)踩坑總結。

1.前端:
前端的ajax請求和普通JQuery下的ajax請求沒有什麼大區別。

$.ajax({
    url:url,
    type:"get",
    dataType:"json",
    data:{filename:week()+'.json'},//ajax的cors請求,和普通ajax請求一樣把參數放進data屬性裏,且不需要在URL添加callback參數。
    success:function (result) {//那麼ajax的cors請求和普通請求又有什麼區別呢?僅僅只是在java tomcat中配置允許2個包就可
        alert("success 函數已經成功調用!");
        for(i in result.theTeams){

            alert(result.theTeams[i].teamname);

        }


    },
    error:function (jqxtr,status) {alert("請求失敗,status:"+jqxtr.status+status+"  readystate:"+jqxtr.readyState+"    status TEXT:"+jqxtr.statusText,errorThrown);

    }//我要對error返回函數的參數有更深刻的認識!這樣才能debug!
    //debug完成了,是服務器端錯誤,如果callback我留空不寫,那麼就會造成錯誤,我要去看日誌。
    //日誌錯誤找到了,發現是因爲不瞭解servlet中getParameter返回值,如果沒有這個值就會返回null而不是空字符串對象“”


});

-------------------可略過-----------------------------------------------------------------------
爲了方便debug,記得了解一下error function()的三個輸入參數。

第一個參數 jqXHR jqXHR:這裏的jqXHR是一個jqXHR對象,在Jquery1.4和1.4版本之前返回的是XMLHttpRequest對象,1.5版本以後則開始使用jqXHR對象,該對象是一個超集,就是該對象不僅包括XMLHttpRequest對象,還包含其他更多的詳細屬性和信息。

這裏主要有4個屬性:

readyState :當前狀態,0-未初始化,1-正在載入,2-已經載入,3-數據進行交互,4-完成。
status  :返回的HTTP狀態碼,比如常見的404,500等錯誤代碼。
statusText :對應狀態碼的錯誤信息,比如404錯誤信息是not found,500是Internal Server Error。
responseText :服務器響應返回的文本信息

第二個參數 String textStatus:返回的是字符串類型,表示返回的狀態,根據服務器不同的錯誤可能返回下面這些信息:“timeout”(超時), “error”(錯誤), “abort”(中止), “parsererror”(解析錯誤),還有可能返回空值。

第三個參數 String errorThrown:也是字符串類型,表示服務器拋出返回的錯誤信息,如果產生的是HTTP錯誤,那麼返回的信息就是HTTP狀態碼對應的錯誤信息,比如404的Not Found,500錯誤的Internal Server Error。
-------------------可略過-----------------------------------------------------------------------

後端JAVA tomcat(7.0)需要處理的就是在tomcat和你的webapp中配置兩個包就可以。
cors-filter-1.7.jar
java-property-utils-1.9.jar
【後續版本請https://mvnrepository.com/search?q=java-property-utils在maven倉庫網搜索下載】
上傳到

  1. tomcat/lib裏面
  2. webapp/你的應用/WEB-INF/你的lib裏面。
  3. 配置你應用的web.xml
    配置方法:
    添加下面的filter作爲你的第一個filter【必須是第一個】。
<filter>       
       <filter-name>CORS</filter-name>
       <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
       <init-param>
        <param-name>cors.allowOrigin</param-name>
           <param-value>*</param-value>
       </init-param>
       <init-param>
        <param-name>cors.supportedMethods</param-name>
           <param-value>GET, POST, HEAD, PUT, DELETE</param-value>
       </init-param>
       <init-param>
        <param-name>cors.supportedHeaders</param-name>
           <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
       </init-param>
       <init-param>
           <param-name>cors.exposedHeaders</param-name>
           <param-value>Set-Cookie</param-value>
       </init-param>
       <init-param>
           <param-name>cors.supportsCredentials</param-name>
           <param-value>true</param-value>
       </init-param>
   </filter>
  
   <filter-mapping>
       <filter-name>CORS</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

然後CORS的配置就算是完成啦!你的api就能輕鬆被其他域的前端調用了。


最後,稍微提一下另一種跨域解決方案JSONP。
JSONP 通過傳script的方法來達成跨域,在JQuery的ajax中也有一定程度的封裝。
在JQuery ajax中把ajax dataType改爲 dataType:“jsonp”便可以正常使用。 他會默認給你一個系統生成的callback函數名稱(可以理解爲success參量的函數),然後請求完了之後就把數據放進你success函數裏,過程是自動化的很方便。至於其他參數什麼的,只需要在data參量中{參量名:參量值,參量名:參量值}就可以了,跟普通ajax一樣的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章