/loadOrderList
, 最終以json串形式返回訂單集合. 該項目使用Tomcat發佈在7070端口.@RequestMapping("/loadOrderList") @ResponseBody public List<Order> loadOrderList(String uid){ //模擬訂單數據 Order o1 = new Order(); o1.setId("111"); o1.setTotal(333.33); o1.setDate("2019-4-29"); Order o2 = new Order(); o2.setId("222"); o2.setTotal(444.44); o2.setDate("2019-5-29"); Order o3 = new Order(); o3.setId("333"); o3.setTotal(555.55); o3.setDate("2019-6-29"); List<Order> list = new ArrayList<>(); list.add(o1); list.add(o2); list.add(o3); return list; }
//index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script type="text/javascript"> function sendAjax() { $.post("http://localhost:7070/order/loadOrderList", "uid=1234", function (data) { alert(data); }); } </script> </head> <body> <a href="javascript:sendAjax()">sendAjax</a> </body> </html>
sendAjax
超連接向訂單系統發送ajax請求.
源
這個概念.Origin
字段來標識源Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Connection: keep-alive Content-Length: 8 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Host: localhost:7070 Origin: http://localhost:9090 協議+域名+端口
Origin
字段決定是否贊成此次請求, 若是Origin
指定的源不在許可範圍內, 服務器會返回一個不帶有Access-Control-Allow-Origin
字段的響應. 瀏覽器解析時發現缺乏了這個字段, 就會報錯. 這種錯誤不能經過狀態碼識別, 由於狀態碼頗有可能就是200(見上面的案例).
Access-Control-Allow-Origin
Access-Control-Allow-Origin
, 那麼就想辦法加上去.CORSFilter
過濾器加上該響應頭.pom.xml
中添加座標<dependency> <groupId>com.thetransactioncompany</groupId> <artifactId>cors-filter</artifactId> <version>2.5</version> <scope>runtime</scope> </dependency>
web.xml
中對過濾器進行配置.<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>
Access-Control-Allow-Origin
, 值爲發起Ajax請求的源.<script>
標籤引入一段js代碼, 這段代碼一般來源於網絡, 也就是不一樣源. 那麼咱們不妨經過<srcipt>
標籤完成Ajax請求, 這樣便順帶解決了跨域問題.<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script> function doCallBack(data){ var str = JSON.stringify(data); alert(str); } </script> </head> <body> <script src="http://localhost:7070/order/loadOrderList3?uid=111&callBack=doCallBack"></script> </body> </html>
doCallBack()
函數, 它接收一個字符串參數, 而且會把接收到的字符串顯示出來.<body>
標籤中編寫<script>
標籤, 咱們將經過<script>
標籤請求訂單系統, 訂單系統將會返回一段js代碼, 這段js代碼會調用doCallBack()
方法.doCallBack(字符串參數...)
js代碼, 咱們在訂單系統中做以下操做.@RequestMapping("/loadOrderList3") @ResponseBody public String loadOrderList3(String uid, String callBack){ //模擬訂單數據 Order o1 = new Order(); o1.setId("111"); o1.setTotal(333.33); o1.setDate("2019-4-29"); Order o2 = new Order(); o2.setId("222"); o2.setTotal(444.44); o2.setDate("2019-5-29"); Order o3 = new Order(); o3.setId("333"); o3.setTotal(555.55); o3.setDate("2019-6-29"); List<Order> list = new ArrayList<>(); list.add(o1); list.add(o2); list.add(o3); //拼接js代碼 String result = callBack + "(" + JSON.toJSONString(list) + ")"; return result; }
doCallBack
的函數, 而jQuery會隨機用時間戳生成一個函數名, 原理和上面是同樣的.<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> <script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.js"></script> <script> function sendAjax(){ $.getJSON("http://localhost:7070/order/loadOrderList3?callBack=?","uid=111", function (data) { var str = JSON.stringify(data); alert(str); }); } </script> </head> <body> <a href="javascript:sendAjax()">sendAjax</a> </body> </html>
CORS
跨域訪問問題的本質, 在後端加上響應頭解決跨域問題. 方案二JSONP
利用的是<script>
標籤可以跨域獲取js代碼的特性, 繞過跨域問題.