本文目錄一覽:
- 1、React之模擬資料庫json-server 2019-01-26
- 2、JWT如何實現登錄、鑒權
- 3、java如何創建Json文件?
- 4、json我就不介紹了,我主要說下怎麼在cocos2dx中加入並使用json,我
React之模擬資料庫json-server 2019-01-26
在前端開發的時候,我們有時候需要驗證一些非同步請求返回數據後的交互效果,那麼就需要搭建一個nodejs伺服器來模擬,但是需要自己去在node項目中寫比較麻煩,json-server就是快速搭建這樣一個node伺服器,你只需要創建一個.json的文件,然後監聽這個文件就可以了
這裡我使用yarn本地安裝並演示json-server,因為我npm已經有了全局的json-server
終端命令:
現在你已經運行了一個小的伺服器,通過向 即可返回數據,但在這之前你需要先在data.json中填寫數據
進入 data.json ,如下格式
打開瀏覽器,進入 即可看到json內容,說明能夠請求伺服器並返回了,終端輸入
curl 也能看到json內容
JWT如何實現登錄、鑒權
JWT(JSON WEB TOKEN):JSON網路令牌,JWT是一個輕便的安全跨平台傳輸格式,定義了一個緊湊的自包含的方式在不同實體之間安全傳輸信息(JSON格式)。它是在Web環境下兩個實體之間傳輸數據的一項標準。實際上傳輸的就是一個字元串。廣義上講JWT是一個標準的名稱;狹義上JWT指的就是用來傳遞的那個token字元串。
由於http協議是無狀態的,所以可以認為客戶端和服務端的所有交互都是新的請求,這就意味著當我們通過賬號密碼驗證用戶時,當下一個request請求時它就不會攜帶剛剛的資料,於是程序只能再次重新識別。JWT就是實現了以JSON的格式,在客戶端和服務端安全的傳輸供認證使用的信息。
根據http協議,我們並不能知道是哪個用戶發出的請求,所以為了讓應用能識別,我們只能在伺服器存儲一份用戶登錄的信息,這份登錄信息會在響應時傳遞給瀏覽器保存為cookie,以便下次請求時發送給應用,這樣應用就能識別請求來自哪個用戶了,這就是傳統的基於session認證。
但是session是保存到伺服器內存當中的,不能跨應用伺服器共享,使得應用很難擴展,隨著客戶端用戶量增加,獨立的伺服器已無法承載更多的用戶,這是基於session身份認證方案的問題就會暴露出來,並且這種方案存在CSRF風險,因此隨著技術的發展就有了基於Token身份認證的方案去解決這些問題。
基於token的鑒權機制類似於http協議也是無狀態的,它不需要在服務端去保留用戶的認證信息或者會話信息。這就意味著基於token認證機制的應用不需要去考慮用戶在哪一台伺服器登錄了,這就為應用的擴展提供了便利,另外因為用戶的信息是保存在分散式緩存中,這種方式就支持分散式水平擴展,支持高並發。
由於token是保存在Redis伺服器中,使用這種方式無疑加大了對Redis緩存組件的依賴和增加了硬體資源的投資。
那麼我們開始介紹JWT的特點。
服務端驗證後,將部分的用戶信息存放到JWT中,也就是存在token的字元串中,比如用戶的email和用戶的姓名等。在鑒權的流程當中,是直接從JWT中直接獲取用戶信息,這樣減少了對Redis緩存組件的依賴,也減少了硬體資源的投入。
優點:
安全性高,防止token被偽造和篡改
自包含,減少存儲開銷
跨語言,支持多種語言實現
支持過期,發布者等校驗
缺點:
JWT不適用存放大量信息,會造成token過長
無法作廢未過期的JWT,所以需要搭配Redis使用,達到用戶登出操作token即失效的要求。
一個JWT是一個字元串,其由Header(頭部)、Payload(負載)和Signature(簽名)三個部分組成,中間以.號分隔,其格式為Header.Payload.Signature。
按照header.payload.signature這個格式串起來,串之前注意,header和payload也要做一個base64url encoded的轉換。那麼最終拼出來的一個例子是:
JWT指定了七個默認claims欄位供選擇。
iss:發行人
sub:主題
aud:用戶
exp:到期時間
nbf:在此之前不可用
iat:發布時間
jti:JWT ID用於標識該JWT
除以上默認欄位外,我們還可以自定義私有欄位,如下例:
{
“sub”:”8208208820”,
“name”:”hubert”,
“role”:”admin”
}
按照JWT標準的說明:保留的claims都是可選的,在生成payload不強制用上面的那些claim,另外你可以按照自己的想法來定義payload的結構,不過這樣搞根本沒必要:第一是,如果把JWT用於認證, 那麼JWT標準內規定的幾個claim就足夠用了,假如想往JWT里多存一些用戶業務信息,比如用戶名(name)和角色(role)等才需要考慮添加自定義claim;第二是,JWT標準裡面針對它自己規定的claim都提供了有詳細的驗證規則描述,每個實現庫都會參照這個描述來提供JWT的驗證實現,所以如果是自定義的claim名稱,那麼你用到的實現庫就不會主動去驗證這些claim。
根據源碼可以發現在校驗過程中主要是校驗JWT字元串的格式、過期時間、加密演算法正確性等。
具體校驗的源碼:
1 發送JWT要用https,因為JWT本身無法保證數據安全性
2 JWT的payload中不要包含太多用戶信息,特別是許可權角色的信息。
3 JWT的payload中建議設定一個expire時間,且不能設置太長,為什麼要設置其實和cookie為什麼設置過期時間一樣,都是為了安全,JWT一旦生成發出去就不可以更改,在有效期內就可以永久使用。
java如何創建Json文件?
如果聊天數據的結構是固定的或變化不大的。
就直接「編排」json字元串。
為要輸出的對象增加一個String toJSON()方法
StringBuilder b=new StringBuilder();
b.append(“{ name:\””);
b.append(username);
b.append(“\”}”);
依次類推
return b.toString();
適合絕大多數情況。
補充:json是做交換格式,查詢效率非常低,如果做存儲的檢索格式就誤用了。
就是說「聊天信息的保存用json應該可以吧」還不如你之前的mysql資料庫。
json用在客戶端往服務端發送的通訊交換數據的格式上。服務端收到後轉為資料庫中或內存中存放。
json我就不介紹了,我主要說下怎麼在cocos2dx中加入並使用json,我
一、首先去下載JsonCpp這個庫。
解壓後,找到include的文件夾。將它們複製到2dx工程的libs目錄,然後加入到工程中。
你可以使用jsoncpp這個庫了,在使用的地方引用頭文件json.h就可以了。
二、jsoncpp的一些使用方法介紹:(網上也有很多介紹,我只是寫下我工作中遇到的一些)
1、初始化
Json::Value root;
Json::Reader reader;
reader.parse(“{“name”:”sunny”}”, root);
Reader可以用來初始化一個人json從字元串。
2、讀取json文件初始化
這是我寫的一個方法:
Json::Value BYJsonDataManager::getJsonFromFile(const char* fileName){
Json::Reader reader;
ifstream file(getFullPath(fileName));
CCAssert(file.is_open(), “file is open fail!”);
Json::Value root;
if (!reader.parse(file, root, false )) {
CCAssert(false, “Json::Reader Parse error!”);
}
return root;
}
const char* BYJsonDataManager::getFullPath(const char* path){
return cocos2d::CCFileUtils::sharedFileUtils()-fullPathFromRelativePath(path);
}
3、解析json
首先生成一個json
Json::Value myjson = getJsonFromFile(“test.json”);//利用上面的函數生成一個json。
int num = myJson[“num”].asInt();
string str = myJson[“name”].asString();
4、json數組
Json::Value myjson = getJsonFromFile(“test.json”);//利用上面的函數生成一個json。
int i = 0;
Json::Value arr = myjson[i];//獲取arr數組的第一個元素
5、利用迭代器獲取json的key。(有時候並不知道json的key,這個時候可以利用迭代器獲取json的key)
Json::Value myjson = getJsonFromFile(“test.json”);//利用上面的函數生成一個json。
Json::Value::Members members(myjson.getMemberNames());
for (Json::Value::Members::iterator it = members.begin(); it != members.end(); ++it) {
const std::string key = *it;
}
6、自己拼裝Json數組,(有時候發往伺服器的數據是一個json數據)
Json::Value arr;
for(int i = 0 ;i 5;++i){
Json::Value myjson = getJsonFromFile(“test.json”);//利用上面的函數生成一個json。
arr.append(protocolData);
}
如果想讓這個jsonArr有key。
Json::Value arr2;
arr2[“array”] = arr;
OK ,目前只記得這些,等我想起其它的再補充。一些比較簡單的沒有都介紹。
原創文章,作者:EFFIN,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/324802.html