1.網(wǎng)絡(luò)請(qǐng)求安全性
目的
確保接口都是合法的被訪問楼雹,而不是外部人員通過接口測(cè)試工具(例如postman)進(jìn)行訪問浆熔。
和后臺(tái)開發(fā)人員溝通好簽名規(guī)則后,Android 未登錄無(wú)token 的情況下后端開發(fā)人員按約定好的加密方式進(jìn)行驗(yàn)簽,若已登錄有token的情況下削葱,安卓端請(qǐng)求頭帶token,后端驗(yàn)證token的合法性
簽名的寫法(舉個(gè)例子)
- 把所有參數(shù)加一個(gè)時(shí)間戳參數(shù)示姿,對(duì)所有參數(shù)首字母排序并生成字符串冕屯。
- 時(shí)間戳整除17取余數(shù)
- 然后整個(gè)字符串從余數(shù)位置進(jìn)行截取,首尾互換,未滿余數(shù)的不截取字符串躯泰,
- 再進(jìn)行MD5加密
實(shí)例代碼
public static String getSignature(JSONObject initParam,long time) throws JSONException {
List<String> list = new ArrayList<>();
Iterator iterable=initParam.keys();
while (iterable.hasNext()){
list.add((String) iterable.next());
}
Collections.sort(list);
StringBuffer sb=new StringBuffer();
for (String s:list){
sb.append(initParam.getString(s));
}
String rawString=sb.toString();
int l= (int)(time%17);
if(rawString.length()>l){
rawString=rawString.substring(l,rawString.length())+rawString.substring(0,l);
}
return Utils.toMD5(rawString);
}
2.APP 免密登錄谭羔,提高用戶體驗(yàn)度。
背景
用戶登錄系統(tǒng)后一直在操作麦向,當(dāng)?shù)絫oken到期后瘟裸,突然該用戶被提示需要重新登錄,這樣的體驗(yàn)是非常不好的诵竭。
開發(fā)前期準(zhǔn)備:后臺(tái)開發(fā)人員提供一個(gè)刷新token的接口
App端開發(fā)思路
- 用戶第一次登錄填寫賬號(hào)密碼后话告,調(diào)用登錄接口獲取用戶信息、accessToken卵慰、refreshToken沙郭,
- 當(dāng)后臺(tái)返回的信息錯(cuò)誤碼為accessToken失效時(shí),使用refreshToken,訪問刷新token的接口獲取最新accessToken
3.手機(jī)上獲取Log裳朋,擺脫電腦限制病线,從而快速準(zhǔn)確定位到bug
背景
常規(guī)情況調(diào)試app,都是手機(jī)連接電腦鲤嫡,根據(jù)Android studio logcat 查看log送挑。
但由于app各個(gè)場(chǎng)景的復(fù)雜性(例如用戶那邊出現(xiàn)bug,公司測(cè)試人員無(wú)法復(fù)現(xiàn)暖眼、bug出現(xiàn)在智慧工廠生產(chǎn)環(huán)境中惕耕,開發(fā)人員不在現(xiàn)場(chǎng)等場(chǎng)景),出現(xiàn)bug時(shí)無(wú)法連接電腦罢荡,便看不到log了赡突,
開發(fā)思路
通過在app代碼中加入執(zhí)行帶有l(wèi)og輸出的cmd命令的代碼对扶,獲取到log輸出的字符串,寫入sd卡完成log實(shí)時(shí)記錄惭缰。
實(shí)例代碼
try {
cmds = "logcat";//打印所有日志信息
logcatProc = Runtime.getRuntime().exec(cmds);
mReader = new BufferedReader(new InputStreamReader(
logcatProc.getInputStream()), 1024);
String line = null;
while (mRunning && (line = mReader.readLine()) != null) {
if (!mRunning) {
break;
}
if (line.length() == 0) {
continue;
}
if (out != null && line.contains(mPID)) {
out.write((line + "\n").getBytes());
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (logcatProc != null) {
logcatProc.destroy();
logcatProc = null;
}
if (mReader != null) {
try {
mReader.close();
mReader = null;
} catch (IOException e) {
e.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
out = null;
}
}
}