給volley封裝訪問的header頭信息,利用頭信息區分和校驗用戶權限

在app後臺設計之初,爲了數據的安全,會設計一套檢驗系統。
只有通過這個校驗的請求才被認爲是自己app的合法訪問。

怎樣確保每次的數據請求都是合法的呢?
我們在數據訪問的時候增加數據請求頭。也就是網絡訪問的header。

先看下面代碼,我們可以通過繼承複寫volley的JsonObjectRequest類,來看看我們的實現類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);
    }

    // 重寫頭信息,爲了服務器授權
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {

        HashMap<String, String> headers = new HashMap<String, String>();
        headers.put(Config.HEADER_KEY, StringUtils.getSign());

        //如果已經登錄,追加頭信息
        if(LoginHelper.isLogin())
        {
            headers.put(Config.HEADER_LOGIN_KEY, MyApplication.gUserID+","+MyApplication.gUserToken);
        }

        return headers;
    }
}

可以看出我們實現了兩個構造函數,還有複寫了getHeaders()這個方法。

  • 代碼很簡單,headers是我們new出一個HashMap集合;

  • 其中Config.HEADER_KEY是我們和服務器定的一個字符串: public static final String HEADER_KEY ="x-xxx****-request-sign";StringUtils.getSign()是我們一個工具類,返回的字符串是 MD5(“時間戳”+“APPKEY”)+“,”+時間戳;實例代碼如下:String sign = getMD5(timestamp+Config.ZHIMIANBAO_APPKEY)+","+timestamp;其中apply是一個隨機的字符串,只要你和服務器商量好,寫入文檔中,這就是你們兩個人知道到密碼,別人是不知道的。可以看出,我們吧獲取的一個系統時間作爲 時間戳 然後和我們的 APPKEY 拼接後,通過MD5後,得到一個唯一的字符串,這裏我們假設這個字符串是‘a12345bcd’和我們的時間戳再拼接爲新的字符串:得到一個新的字符串:‘a12345bcd,4221245’,這就是我們工具類返回的結果。

header的作用:安全校驗,權限校驗

  • 我們通過volley請求服務器的時候,服務器會得到我們velloy的頭信息。即得到裏a12345bcd,4221245,服務器會通過“,”把拆分爲兩部分:‘a12345bcd’和‘4221245’,拿着4221245’這個時間戳,也做和上面通用的處理:MD5(“時間戳”+“APPKEY”),會得到一個新的字符串,如果你們用的是同一個APPKEY,和通一個“時間戳”,服務器也會得到相同的字符串‘a12345bcd’,你請求頭裏的,和服務器自己MD5的到的是相同的,說明請求是合法的,也就是自己的應用請求數據。加入請求在別修改,或者是第三方的程序修改,他們是不知道APPKEY的,所以得不到MD5以後,和服務器的MD5後的字符串不同,服務器一比較,就知道是不合法的請求。

  • 同理:我們在限定登錄用戶,和非登錄用戶訪問權限的時候,也是給服務器發送請求頭。如果登錄了,volley的頭信息是已登錄的頭信息,如果沒有登錄,volley的頭信息是非登錄頭信息,服務器可以根據頭信息,返回不同的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章