AJAX跨域解決方法 javascript
跨域,簡單地理解就是由於瀏覽器基於安全的同源策略限制不一樣域名和協議之間的互相訪問。前端
而AJAX的跨域請求,其實瀏覽器並無限制不一樣域的網絡請求,只是瀏覽器會基於請求返回響應頭作處理,若是發現是跨域請求且響應頭Access-Control-Allow-Origin未對請求來源設置容許,則根據非同源禁止策略,瀏覽器不會將服務端返回的數據交給AJAX,這樣就會阻止不一樣域之間的數據交互。java
介紹兩張經常使用的低廉的解決方案:ajax
1)服務端對訪問的來源設置Access-Control-Allow-Origin響應頭許可;apache
此方法不須要javascript作任何改動,只須要服務端層面作處理,相對來講簡單易用。json
response.setHeader(
"Access-Control-Allow-Origin"
,
"*"
);
後端
感受這個接口太開放了,不太安全。跨域
若是想只設置本身指定的若干個域名或者端口能夠調用接口。瀏覽器
response.addHeader("Access-Control-Allow-Origin","http://a.com,http://b.com");
2)JSONPtomcat
jsonp的實現原理,其實就是經過動態加載script標籤,預先定義好callback函數處理邏輯,服務端返回的數據實際上是一個執行函數的代碼,將有效數據做爲callback函數的參數。
此方法須要前端和服務端同時作支持,實現成本也比較低廉。
$.ajax({
url:"http://192.168.6.21:8080/jsonp/servlet/Ajax",
data:"data=guoyansi",
type:"get",
dataType:"jsonp",
jsonp:"callbackparam",//傳遞給請求處理程序或頁面的,用以得到jsonp回調函數名的接受 的參數名(默認爲callback)
jsonpCallback:"jsonpCallback",// 可選項,寫上表示返回函數的函數名用「 jsonpCallback」,不寫 默認爲jQuery自動生成的隨機函數,
error:function(){alert("服務器鏈接失敗");},
success:function(data){
for(var key in data){
alert(key+":"+data[key]);
}
}
});
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class Ajax extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
String callbackparam=request.getParameter("callbackparam");
System.out.println("callbackparam:"+callbackparam);
String name=request.getParameter("data");
System.out.println("param:"+name);
Map<String, String> map=new HashMap<String, String>();
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
map.put("4", "d");
JSONObject jsonObject=JSONObject.fromObject(map);
String result=jsonObject.toString();
PrintWriter writer=response.getWriter();
//若是ajax請求寫了 jsonpCallback:"jsonpCallback",
writer.write("jsonpCallback("+result+")");
//若是ajax請求沒有寫 jsonpCallback:"jsonpCallback",
writer.write(callbackparam+"("+result+")");//須要callbackparam參數接收隨機函數名
}
}
tomcat使用cookie中jsessionid來區分客戶端session會話
跨域請求接口偏偏有時候響應回來會改變服務端的jsessionid值,致使服務器每次判斷都是一個新的會話
若是Response 一個cookie值,SET-COOKIE:JSESSIONID=XXXX
服務端,前端刷新一次也沒,後端服務會話id都不是同一個sessionid,全部後端全部的請求都是未登陸,這就致使前端發送的請求,後端沒法拿到當前我的用戶信息
服務端部署採用tomcat,因此修改辦法是在$TOMCAT_TOME/conf/catalina.properties文件中加上一句,
org.apache.catalina.SESSION_COOKIE_NAME=MYSESSIONID
設置sessionId的cookieName別名,不和默認的jsessionid一直,
最終修改好後,再看服務器的cookie值,服務端使用session取的cookie值是剛剛設置的別名cookie值MYSESSIONID,因此不受跨域接口影響