小追兵專欄
在app后臺設(shè)計之初暴心,為了數(shù)據(jù)的安全,會設(shè)計一套檢驗系統(tǒng)杂拨。
只有通過這個校驗的請求才被認為是自己app的合法訪問专普。
怎樣確保每次的數(shù)據(jù)請求都是合法的呢?
我們在數(shù)據(jù)訪問的時候增加數(shù)據(jù)請求頭弹沽。也就是網(wǎng)絡(luò)訪問的header檀夹。
先看下面代碼,我們可以通過繼承復(fù)寫volley的JsonObjectRequest
類策橘,來看看我們的實現(xiàn)類SignJsonRequest
的具體做法:
header代碼封裝 :
package com.xxxx.xxxx.xxx;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import biz.lemeng.zhimianbao.Config;
import biz.lemeng.zhimianbao.app.MyApplication;
import biz.lemeng.zhimianbao.model.LoginHelper;
import biz.lemeng.zhimianbao.utils.StringUtils;
import com.android.volley.AuthFailureError;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.JsonObjectRequest;
public class SignJsonRequest extends JsonObjectRequest {
public SignJsonRequest(String url, JSONObject jsonRequest,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(url, jsonRequest, listener, errorListener);
}
public SignJsonRequest(int method, String url, JSONObject jsonRequest,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, url, jsonRequest, listener, errorListener);
}
// 重寫頭信息炸渡,為了服務(wù)器授權(quán)
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<String, String>();
headers.put(Config.HEADER_KEY, StringUtils.getSign());
//如果已經(jīng)登錄,追加頭信息
if(LoginHelper.isLogin())
{
headers.put(Config.HEADER_LOGIN_KEY, MyApplication.gUserID+","+MyApplication.gUserToken);
}
return headers;
}
}
可以看出我們實現(xiàn)了兩個構(gòu)造函數(shù)丽已,還有復(fù)寫了getHeaders()
這個方法蚌堵。
代碼很簡單,headers是我們new出一個HashMap集合促脉;
其中
Config.HEADER_KEY
是我們和服務(wù)器定的一個字符串:public static final String HEADER_KEY ="x-xxx****-request-sign";
辰斋;StringUtils.getSign()
是我們一個工具類策州,返回的字符串是 MD5(“時間戳”+“APPKEY”)+“,”+時間戳宫仗;實例代碼如下:String sign = getMD5(timestamp+Config.ZHIMIANBAO_APPKEY)+","+timestamp;
其中apply是一個隨機的字符串够挂,只要你和服務(wù)器商量好,寫入文檔中藕夫,這就是你們兩個人知道到密碼孽糖,別人是不知道的∫阒可以看出办悟,我們吧獲取的一個系統(tǒng)時間作為 時間戳 然后和我們的 APPKEY 拼接后,通過MD5后滩褥,得到一個唯一的字符串病蛉,這里我們假設(shè)這個字符串是‘a(chǎn)12345bcd’和我們的時間戳再拼接為新的字符串:得到一個新的字符串:‘a(chǎn)12345bcd,4221245’瑰煎,這就是我們工具類返回的結(jié)果铺然。
header的作用:安全校驗,權(quán)限校驗
- 我們通過volley請求服務(wù)器的時候酒甸,服務(wù)器會得到我們velloy的頭信息魄健。即得到里a12345bcd,4221245插勤,服務(wù)器會通過“沽瘦,”把拆分為兩部分:‘a(chǎn)12345bcd’和‘4221245’,拿著4221245’這個時間戳农尖,也做和上面通用的處理:MD5(“時間戳”+“APPKEY”)析恋,會得到一個新的字符串,如果你們用的是同一個APPKEY,和通一個“時間戳”卤橄,服務(wù)器也會得到相同的字符串‘a(chǎn)12345bcd’绿满,你請求頭里的,和服務(wù)器自己MD5的到的是相同的窟扑,說明請求是合法的喇颁,也就是自己的應(yīng)用請求數(shù)據(jù)。加入請求在別修改嚎货,或者是第三方的程序修改橘霎,他們是不知道APPKEY的,所以得不到MD5以后殖属,和服務(wù)器的MD5后的字符串不同姐叁,服務(wù)器一比較,就知道是不合法的請求。
- 同理:我們在限定登錄用戶外潜,和非登錄用戶訪問權(quán)限的時候原环,也是給服務(wù)器發(fā)送請求頭。如果登錄了处窥,volley的頭信息是已登錄的頭信息嘱吗,如果沒有登錄,volley的頭信息是非登錄頭信息滔驾,服務(wù)器可以根據(jù)頭信息谒麦,返回不同的數(shù)據(jù)。
最后:有需要Shadowsock翻墻賬號可以私聊哆致。