跨域發送HTTP請求詳解
阿新 • • 發佈:2018-07-04
ext open author read stat 請求 buffere keyset post
------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------
本篇博客講述幾種跨域發HTTP請求的幾種方法,POST請求,GET請求
目錄:
一,采用JsonP的方式(只能是GET)
二,采用CROS的方式(需要在接收的一端也有配置)
三,采用form表單的方式(有些時候會存在問題,一會詳細說明)
四,采用代理網站幫忙轉(不推薦,不安全,性能低,不做解釋)
五,後臺JAVA後端通過net方式發送
一,jsonP的方式:
$.ajax({ url:"http://localhost:9090/student", type: "GET", dataType: "jsonp", //指定服務器返回的數據類型 success: function (data) { var result = JSON.stringify(data); //json對象轉成字符串 $("#text").val(result); } });
它只能發送get請求
二,CROS的方式:(需要接收的一端也配置)
1.發送處:
$.ajax({ url: "your url which return json", type: "POST", crossDomain: true, data: data, dataType: "json", success:function(result){ alert(JSON.stringify(result)); }, error:function(xhr,status,error){ alert(status); } });
2.接收處:
response.addHeader( "Access-Control-Allow-Origin", "*" ); response.addHeader( "Access-Control-Allow-Methods", "POST" ); response.addHeader( "Access-Control-Max-Age", "1000" );
三,采用Form表單的方式提交,(可以實現POST跨域請求)
把數據封裝成form表單中的字段,然後發送過去
不好的點:加入你在form表單提交的過程中,這個新增彈窗被代碼給直接關掉,有可能的是它沒有傳過去
function crossDomainPost() { // Add the iframe with a unique name var iframe = document.createElement("iframe"); var uniqueString = "CHANGE_THIS_TO_SOME_UNIQUE_STRING"; document.body.appendChild(iframe); iframe.style.display = "none"; iframe.contentWindow.name = uniqueString; // construct a form with hidden inputs, targeting the iframe var form = document.createElement("form"); form.target = uniqueString; form.action = "http://INSERT_YOUR_URL_HERE"; form.method = "POST"; // repeat for each parameter var input = document.createElement("input"); input.type = "hidden"; input.name = "INSERT_YOUR_PARAMETER_NAME_HERE"; input.value = "INSERT_YOUR_PARAMETER_VALUE_HERE"; form.appendChild(input); document.body.appendChild(form); form.submit(); }
四,采用代理(不安全,性能不好,所以不講)
五,采用後臺發送(Java的net)
註意的點:不要在事務開啟的那層發,有可能你發數據的時候還沒持久化到數據庫,所以接收的那一端沒有
package com.xy.aider; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; /** * 後臺發送跨域的post和get請求 * @author Heng Hui * */ public class SendHttpRequestUtil { /** * 向指定URL發送GET方法的請求 * * @param url * 發送請求的URL * @param param * 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return URL 所代表遠程資源的響應結果 */ public static String sendGet(String url, String param) { String result = ""; BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打開和URL之間的連接 URLConnection connection = realUrl.openConnection(); // 設置通用的請求屬性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); //備用方案 //conn.setRequestProperty("UserAgent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 建立實際的連接 connection.connect(); // 獲取所有響應頭字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍歷所有的響應頭字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定義 BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送GET請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } /** * 向指定 URL 發送POST方法的請求 * @param url 發送請求的 URL * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return 所代表遠程資源的響應結果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 打開和URL之間的連接 URLConnection conn = realUrl.openConnection(); // 設置通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); //備用方案 //conn.setRequestProperty("UserAgent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 發送POST請求必須設置如下兩行 conn.setDoOutput(true); conn.setDoInput(true); //1.獲取URLConnection對象對應的輸出流 out = new PrintWriter(conn.getOutputStream()); //2.中文有亂碼的需要將PrintWriter改為如下 //out=new OutputStreamWriter(conn.getOutputStream(),"UTF-8") // 發送請求參數 out.print(param); // flush輸出流的緩沖 out.flush(); // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送 POST 請求出現異常!"+e); e.printStackTrace(); } //使用finally塊來關閉輸出流、輸入流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } System.out.println("post推送結果:"+result); return result; } ///數據類似這種寫入 public void testDemo(){ //發送 GET 請求 String s=SendHttpRequestUtil.sendGet("http://localhost:6144/Home/RequestString", "key=123&v=456"); System.out.println(s); //發送 POST 請求 String sr=SendHttpRequestUtil.sendPost("http://localhost:6144/Home/RequestPostString", "key=123&v=456"); System.out.println(sr); } }
跨域發送HTTP請求詳解