Ⅰ 前端與後端的數據交互(jquery ajax+python flask)
如果要給後端傳遞json數據,就需要增加content-type參數,告訴後端,傳遞過來的數據格式,並且需要將data轉為字元串進行傳遞。實際上,服務端接收到後,發現是json格式,做的操作就是將字元串轉為json對象。
另外,不轉為字元串,即使加了content-type的參數,也默認會轉成 name=xx&age=1,使後端無法獲取正確的json
接收表單數據
接收Json數據
Flask可以非常方便的返回json數據
看一下源碼就可以知道,jsonify就是幫我們做了點添加mimetype這樣的雜事,所以如果不嫌麻煩和難看,你也可以這樣寫
放兩張截圖來直觀看一下請求
Ⅱ 前後端分類,數據傳輸問題
目前我所知道的項目開發中,基本上都是前後端分離的。這就出現了數據傳輸的問題,前端傳給伺服器 或者 伺服器傳給前端的數據都是容易被別人竊取的。這里就要對傳輸的數據進行加解密,以保證數據安全。
下面介紹兩種前後端數據傳輸的方式
前後端約定一個key,將請求參數按照字母排序拼接成一個字元串(通常都是ASCll排序),然後拼接上key,最後用MD5或者SHA進行加密,得到一個加密的簽名sign,再把sign作為最後一個參數傳到服務端。
服務端拿到前端傳過來的結果之後,也將參數(排除sign)按照順序拼接成一個字元串,再拼接上key,再用MD5或者SHA進行加密,也得到了一個新的sign,服務端比較這兩個sign,如果相同就說明傳回來的數據沒有問題,如果不相同,說明數據被串改了。
例如:
傳遞的參數是
id=5&age=10
現在通過加簽 應該傳遞的參數為
id=5&age=10&sign=MD5(age=10&id=5)
服務端拿到的就是
id=5&age=10&sign=MD5(age=10&id=5)
服務端經過篩選參數,得到 id=5&age=10 ,然後進行排序得到 age=10&id=5 ,再MD5得到sign,兩個sign進行比較
目前我知道的根據秘鑰的使用方法,可以將密碼分為兩種
在對稱密碼中,加密、解密時使用的是同一個密鑰,我們常用的AES演算法就是對稱密碼演算法。具體AES演算法大家自己網路就好了
但是通常使用對稱密碼時,就會有秘鑰配送問題。
例:發送者A將使用對稱密碼加密過得信息發送給接收者B,只有將秘鑰發送給接收者B,B才能進行解密,這里A發送秘鑰給B的過程中,就容易被別人竊取秘鑰,別人拿著秘鑰也能進行解密。
如何解決秘鑰配送問題
我知道的幾種解決方法
公鑰密碼
公鑰密碼中,密鑰分為加密密鑰、解密密鑰2種,它們並不是同一個密鑰。
目前使用最廣泛的公鑰密碼演算法是RSA
加密密鑰,一般是公開的,因此該密鑰稱為公鑰(public key)
解密密鑰,由消息接收者自己保管的,不能公開,因此也稱為私鑰(private key)
公鑰和私鑰是一 一對應的,是不能單獨生成的,一對公鑰和密鑰統稱為密鑰對(key pair)
由公鑰加密的密文,必須使用與該公鑰對應的私鑰才能解密
由私鑰加密的密文,必須使用與該私鑰對應的公鑰才能解密
1.由消息的接收者,生成一對公鑰、私鑰
2.將公鑰發給消息的發送者
3.消息的發送者使用公鑰加密消息
混合密碼系統
不能很好地解決密鑰配送問題
加密解密速度比較慢
混合密碼系統,是將對稱密碼和公鑰密碼的優勢相結合的方法,解決了公鑰密碼速度慢的問題,並通過公鑰密碼解決了對稱密碼的密鑰配送問題
會話密鑰(session key)為本次通信隨機生成的臨時密鑰,作為對稱密碼的密鑰,用於加密信息,提高速度
發送出去的內容包括
前端A >>>>> 伺服器端B
發送過程,加密過程
接收過程,解密過程
文章參考了 猿天地的再談前後端API簽名安全? 和李明傑的底層原理iOS簽名機制
Ⅲ 作為java後端,在用protobuf的情況下我該給前端傳什麼形式的數據
protobuf是你們落地時存儲的數據格式,跟給前端的格式是沒有關系的。
可以通過工具類直接轉json後傳給前端。
Class<?> clazz = Class.forName(className);
Method method = clazz.getMethod("parseFrom", byte[].class);
JsonFormat().printToString((GeneratedMessage) method.invoke(clazz, bytes));
其中className是你根據protobuf文件生成的java類,bytes是讀取的protobuf對象的位元組數組。
Ⅳ 前端ajax非同步傳值以及後端接收參數的幾種方式
前台往後台傳值呢,有很多種方式,大家聽我細野猜細道來。
第一種呢,也是最簡單的一種,通過get提交方式,將參數在鏈接中以問頌襲型號的形式進行傳遞。
後台往前台傳值就要簡單一些,單個數據或者封裝數據可以直接使用return返回json數據給前台,如果是多個數據,可以使用```
PrintWriter進行傳值,具體操作如下
非非同步方式傳值
非非同步方式前台傳遞參數
1.與非同步方式類似,使用form直接提交或者在鏈接中拼接參數即可。
2.後台接受參數方式不變,與非同步方式完全相同。禪野
非非同步方式後台向前台傳遞數據
Ⅳ 前端能處理多大數據,以及後端能傳給前端多大數據
1 前段使用bootstrap table 顯示數據表格(包括分頁功能),後端返回類型為PageBean時 前無需做特殊處理
部分代碼為
maplist=customerService.search(map);
int count = customerService.searchCount(map);
PageBean pageBean = new PageBean();
pageBean.setTotal(count);
pageBean.setRows(maplist);
return pageBean;
2 後端返回類型為List時,前段獲取方式為result.length
後端java:
public List> search(){
return domainService.search();
}
前段js:
success : function(result) {
for(var i =0;i
result[i].id
}
}
3 後端返回類型為PageBean>>時,前段獲取方式為result.rows
後端java:
PageBean>> pageBean = new PageBean>>();
pageBean.setTotal(count);
pageBean.setRows(result);
return pageBean;
前段js:
success : function(result) {
var result= result.rows;
for(var i =0;i
result[i].name
}
}
4 後端返回類型為Map時,前段獲取方式為result
後端java:
public Map register(HttpServletRequest request){
return map.put("result ", 「成功」);
}
前段js:
success : function(result) {
result.result
}
Ⅵ java中後台向前端傳值的幾種方式
一種,放到request、session、application域裡面。
1、直接放入一個實體(基本類型)
2、放入一個集合、數組
3、放入JSON(字元串)
Ⅶ 後端提供什麼類型 的介面和前端交互
一般後端介面提供JSON格式的數據類型與前端交互
也可以使用XML格式的數據類型,前者使用頻率更高
Ⅷ DRF怎麼將後端bytes類型數據傳給前端
1. 參數放在request的header上:request.getParameter() �0�2 / �0�2�0�2request.getParameter()�0�2
2. 參數放在request的body上:
@RequestMapping(value = "/XXXX", method = RequestMethod.POST, headers = "Content-type=text/plain")
@ResponseBody
public HashMap dataCenterEntry(final HttpServletRequest request){
String body =null;
try {
body = StreamUtils.ToString(request.getInputStream(), Charset.forName("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
�0�2 �0�2 �0�2 �0�2 �0�2 �0�2 �0�2 �0�2return XXXX;
}
期間碰到一個問題,body 始終為空,怎麼都接收不到數據;
解決辦法:在@RequestMapping(value = "/XXXX", method = RequestMethod.POST)里加個headers = "Content-type=text/plain"後就好了;
---------------------------------------------------------------------------------------------------------
public static String ToString(InputStream in, Charset charset) throws IOException {
Assert.notNull(in, "No InputStream specified");
StringBuilder out = new StringBuilder();
InputStreamReader reader = new InputStreamReader(in, charset);
char[] buffer = new char[BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = reader.read(buffer)) != -1) {
out.append(buffer, 0, bytesRead);
}
return out.toString();
}