客戶端:AjaxClient 端口:8081javascript
服務端:AjaxServer 端口:8080html
package com.kunfan;前端
import org.springframework.web.bind.annotation.GetMapping;java import org.springframework.web.bind.annotation.RequestMapping;jquery import org.springframework.web.bind.annotation.RestController;git
@RestController//rest接口github @RequestMapping("/ajax")web public class Constroller {ajax
@GetMapping("/getMessage")//spring4.0方法spring public Model getone(){ System.out.println("getone"); return new Model("jack","1001030202"); }
} |
package com.kunfan;
public class Model {
private String name;
private String idCard;
public String getIdCard() { return idCard; }
public void setIdCard(String idCard) { this.idCard = idCard; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Model(String name, String idCard) { super(); this.name = name; this.idCard = idCard; }
} |
一、https://jasmine.github.io/ 下載jasmine包
二、將解壓後lib目錄下的文件夾拷貝到客戶端工程 static目錄下
三、客戶端工程static目錄下新增index.html,並在其中編寫jasmine測試用例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script src="./jquery/jquery-3.3.1.min.js"></script> <script src="./jasmine-3.2.1/jasmine.js"></script> <script src="./jasmine-3.2.1/jasmine-html.js"></script> <script src="./jasmine-3.2.1/boot.js"></script> </head> <body> <a herf="#" onclick="getMsg()">getMessage</a> <imag src="http://localhost:8080/ajax/getMessage"></imag>
<script type="text/javascript"> /** 不用jasmine框架 **/ function getMsg(){ $.ajax({ url : "http://localhost:8080/ajax/getMessage", //請求url type : "GET", //請求類型 post|get // data : "key=value&key1=value2", //後臺用 request.getParameter("key"); dataType : "json", //返回數據的 類型 text|json|html-- success : function(data){ //回調函數 和 後臺返回的 數據 alert(JSON.stringify(data)); } }); }
/** jasmine框架測試 **/ // 每個測試用例的超時時間 jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
// 請求的接口的前綴 var base = "http://localhost:8080/ajax";
//測試模塊 describe("getMessageJasmine", function() { // 測試方法 it("getMessage", function(done) { // 服務器返回的結果 var result; //調用異步請求 將結果保存到result $.getJSON(base + "/getMessage").then(function(jsonObj) { result = jsonObj; }); // 因爲是異步請求,須要使用setTimeout來校驗 setTimeout(function() { expect(result).toEqual({"name":"jack","idCard":"1001030202"}); // 校驗完成,通知jasmine框架 done(); }, 100); }); });
</script>
</body> </html> |
同時知足三個條件:瀏覽器限制、跨域、xhr請求
package com.kunfan;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice;
@ControllerAdvice public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice{
public JsonpAdvice() { super("callback");//此值應該與前端ajax調用中jsonp的值相同,ajax默認爲callback } } |
// 測試方法(jsonp解決跨域) it("jsonp解決跨域", function(done) { // 服務器返回的結果 var result; //調用異步請求 將結果保存到result $.ajax({ url : base+"/getMessage",//請求url type : "GET", //請求類型 post|get // data : "key=value&key1=value2", //後臺用 request.getParameter("key"); dataType : "jsonp", //返回數據的 類型 text|json|html-- jsonp : "callback",//默認 可不寫 success : function(data){ //回調函數 和 後臺返回的 數據 result = data; } }); |
Jsonp請求會添加請求參數
Callback是jsonp中約定的參數值(即:ajax中jsonp的值)
_:是否緩存,在ajax中添加cache : true ,此參數就沒了
一、改服務端代碼
二、約定,經過jsonp的值約定
三、動態建立script,經過script函數調用發出請求,返回值是也是js,函數名callback參數的值,函數參數是返回的json對象
四、只支持get請求
五、發送的不是xhr請求
六、不能 異步、事件 等
簡單請求:瀏覽器先執行後判斷
非簡單請求:瀏覽器先判斷後執行
@Bean public FilterRegistrationBean filter(){
FilterRegistrationBean bean = new FilterRegistrationBean(); bean.addUrlPatterns("/*");//支持全部請求 bean.setFilter( new MyFilter());//設置filter實例
return bean;
} |
MyFilter implements Filter public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) arg0; HttpServletResponse res = (HttpServletResponse)arg1;//將響應強轉成HttpServletResponse
String origin = req.getHeader("Origin");//得到client請求頭
res.addHeader("Access-Control-Allow-Origin", origin);//設置origin 請求url:port res.addHeader("Access-Control-Allow-Methods", "*");//調用方法 get、put、delete、post等 ,*全部方法 res.addHeader("Access-Control-Allow-Headers", "Content-Type");//ajax裏面的contentType
arg2.doFilter(arg0, arg1);
} |
//非簡單請求 @PostMapping("/getMessage2")//spring4.0方法 public Model getPost(@RequestBody Model model){ System.out.println("getpost"); return new Model(model.getName(),model.getIdCard()); } |
private String name; private String idCard; |
//測試模塊(被調用方filter解決跨域) describe("getpostJasmine", function() { // 測試方法(被調用方filter解決跨域) it("被調用方filter解決跨域", function(done) { // 服務器返回的結果 var result; //調用異步請求 將結果保存到result $.ajax({ url : base+"/getMessage2",//請求url type : "post",//請求類型 post|get contentType : "application/json;charset=utf-8",//非簡單請求 data : JSON.stringify({"name":"tom","idCard":"10010302022"}), success : function(data){//回調函數 和 後臺返回的 數據 result = data; } }); // 因爲是異步請求,須要使用setTimeout來校驗 setTimeout(function() { expect(result).toEqual({"name":"tom","idCard":"10010302022"}); // 校驗完成,通知jasmine框架 done(); }, 100); }); }); |
//測試模塊(被調用方filter解決跨域)
describe("getpostJasmine", function() {
// 測試方法(被調用方filter解決跨域)
it("被調用方filter解決跨域", function(done) {
// 服務器返回的結果
var result;
//調用異步請求 將結果保存到result
$.ajax({
url : base+"/getMessage2",//請求url
type : "post",//請求類型 post|get
contentType : "application/json;charset=utf-8",//非簡單請求
data : JSON.stringify({"name":"tom","idCard":"10010302022"}),
success : function(data){//回調函數 和 後臺返回的 數據
result = data;
}
});
// 因爲是異步請求,須要使用setTimeout來校驗
setTimeout(function() {
expect(result).toEqual({"name":"tom","idCard":"10010302022"});
// 校驗完成,通知jasmine框架
done();
}, 100);
});
});