溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么實(shí)現(xiàn)APP HTTP接口報(bào)文的加密與壓縮

發(fā)布時(shí)間:2022-01-19 11:23:17 來(lái)源:億速云 閱讀:601 作者:柒染 欄目:互聯(lián)網(wǎng)科技

今天給大家介紹一下怎么實(shí)現(xiàn)APP HTTP接口報(bào)文的加密與壓縮。文章的內(nèi)容小編覺(jué)得不錯(cuò),現(xiàn)在給大家分享一下,覺(jué)得有需要的朋友可以了解一下,希望對(duì)大家有所幫助,下面跟著小編的思路一起來(lái)閱讀吧。

在做APP類(lèi)的產(chǎn)品時(shí),整個(gè)業(yè)務(wù)邏輯通常都會(huì)放在服務(wù)端,客戶端大部分僅用來(lái)展示。  在客戶端與服務(wù)端的交互過(guò)程中,報(bào)文的安全及流量的節(jié)約相對(duì)來(lái)說(shuō)就顯得比較重要。   本文展示如何通過(guò)3DES對(duì)報(bào)文進(jìn)行加密,并通過(guò)Nginx自帶的gzip對(duì)報(bào)文進(jìn)行壓縮。

一: 加密規(guī)則及流程
怎么實(shí)現(xiàn)APP HTTP接口報(bào)文的加密與壓縮

二: nginx 開(kāi)啟gzip配置

   gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 5;
    gzip_types application/json;
    gzip_vary on;


gzip
語(yǔ)法: gzip on|off
默認(rèn)值: gzip off
作用域: http, server, location, if (x) location
開(kāi)啟或者關(guān)閉gzip模塊

gzip_buffers
語(yǔ)法: gzip_buffers number size
默認(rèn)值: gzip_buffers 4 4k/8k
作用域: http, server, location
設(shè)置系統(tǒng)獲取幾個(gè)單位的緩存用于存儲(chǔ)gzip的壓縮結(jié)果數(shù)據(jù)流。 例如 4 4k 代表以4k為單位,按照原始數(shù)據(jù)大小以4k為單位的4倍申請(qǐng)內(nèi)存。 4 8k 代表以8k為單位,按照原始數(shù)據(jù)大小以8k為單位的4倍申請(qǐng)內(nèi)存。
如果沒(méi)有設(shè)置,默認(rèn)值是申請(qǐng)跟原始數(shù)據(jù)相同大小的內(nèi)存空間去存儲(chǔ)gzip壓縮結(jié)果。

gzip_comp_level
語(yǔ)法: gzip_comp_level 1..9
默認(rèn)值: gzip_comp_level 1
作用域: http, server, location
gzip壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理最慢(傳輸快但比較消耗cpu)。

gzip_min_length
語(yǔ)法: gzip_min_length length
默認(rèn)值: gzip_min_length 0
作用域: http, server, location
設(shè)置允許壓縮的頁(yè)面最小字節(jié)數(shù),頁(yè)面字節(jié)數(shù)從header頭中的Content-Length中進(jìn)行獲取。
默認(rèn)值是0,不管頁(yè)面多大都?jí)嚎s。
建議設(shè)置成大于1k的字節(jié)數(shù),小于1k可能會(huì)越壓越大。 即: gzip_min_length 1024

gzip_http_version
語(yǔ)法: gzip_http_version 1.0|1.1
默認(rèn)值: gzip_http_version 1.1
作用域: http, server, location
識(shí)別http的協(xié)議版本。由于早期的一些瀏覽器或者h(yuǎn)ttp客戶端,可能不支持gzip自解壓,用戶就會(huì)看到亂碼,所以做一些判斷還是有必要的。 注:21世紀(jì)都來(lái)了,現(xiàn)在除了類(lèi)似于百度的蜘蛛之類(lèi)的東西不支持自解壓(百度就是SX,我就不說(shuō)了),99.99%的瀏覽器基本上都支持gzip解壓了,所以可以不用設(shè)這個(gè)值,保持系統(tǒng)默認(rèn)即可。

gzip_proxied
語(yǔ)法: gzip_proxied [off|expired|no-cache|no-store|private|no_last_modified|no_etag|auth|any] ...
默認(rèn)值: gzip_proxied off
作用域: http, server, location
Nginx作為反向代理的時(shí)候啟用,開(kāi)啟或者關(guān)閉后端服務(wù)器返回的結(jié)果,匹配的前提是后端服務(wù)器必須要返回包含"Via"的 header頭。
off - 關(guān)閉所有的代理結(jié)果數(shù)據(jù)的壓縮
expired - 啟用壓縮,如果header頭中包含 "Expires" 頭信息
no-cache - 啟用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息
no-store - 啟用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息
private - 啟用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啟用壓縮,如果header頭中不包含 "Last-Modified" 頭信息
no_etag - 啟用壓縮 ,如果header頭中不包含 "ETag" 頭信息
auth - 啟用壓縮 , 如果header頭中包含 "Authorization" 頭信息
any - 無(wú)條件啟用壓縮

gzip_types
語(yǔ)法: gzip_types mime-type [mime-type ...]
默認(rèn)值: gzip_types text/html
作用域: http, server, location



三:客戶端Http 請(qǐng)求 及返回結(jié)果解析

public class HttpClientUtilTest {


    private static Logger logger = Logger.getLogger(HttpClientUtil.class);
    private static HttpClient httpClient = null;
    private static HttpPost postMethod = null;
    private static HttpGet getMethod = null;
    private static long startTime = 0L;
    private static long endTime = 0L;
    private static ObjectMapper jsonMapper;
    static{
        jsonMapper = new ObjectMapper();
        jsonMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        jsonMapper.configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
        jsonMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
    }


    /**
     * @description 發(fā)送json請(qǐng)求,并返回結(jié)果
     * @param url
     *            請(qǐng)求地址
     * @param jsonRequest
     *            請(qǐng)求參數(shù)
     * @return jsonResponse 返回結(jié)果
     * @throws
     */
    public static String sendJsonRequest(String url, String jsonRequest)
            throws Exception {
    logger.info("請(qǐng)求URL:" + url);
        logger.info("請(qǐng)求參數(shù):" + jsonRequest);
        String jsonResponse = null;
        httpClient = new DefaultHttpClient();
        postMethod = new HttpPost(url);


        StringEntity entity = new StringEntity(jsonRequest, "UTF-8");
        entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_ENCODING,
                Consts.UTF_8.toString()));
        entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE,
                "application/json;charset=UTF-8"));


        postMethod.setEntity(entity);
        postMethod.getParams().setParameter(
                CoreProtocolPNames.USER_AGENT,
                System.getProperty("os.name") + "(version "
                        + System.getProperty("os.version") + " "
                        + System.getProperty("os.arch") + ") "
                        + System.getProperty("user.language"));
      //添加頭信息告訴服務(wù)端可以對(duì)Response進(jìn)行GZip壓縮  
        postMethod.setHeader("Accept-Encoding", "gzip, deflate");
        // 開(kāi)始請(qǐng)求
        startTime = System.currentTimeMillis();
        HttpResponse response = httpClient.execute(postMethod);


        logger.info("status:"+response.getStatusLine().getStatusCode());
        
        // 讀取請(qǐng)求結(jié)果
        if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
            HttpEntity httpEntity = response.getEntity();
            //對(duì)gzip壓縮過(guò)的返回結(jié)果 進(jìn)行解密
            if(response.getFirstHeader("Content-Encoding") != null  && response.getFirstHeader("Content-Encoding").getValue().toLowerCase().indexOf("gzip") > -1) 
            {
            jsonResponse =dealGzipResponse(response);
            }
            else {
            jsonResponse = EntityUtils.toString(httpEntity);

}


        }
        endTime = System.currentTimeMillis();
        logger.info("返回結(jié)果size:" + jsonResponse.length());
        logger.info("返回結(jié)果:" + Des3.decode(jsonResponse,"tU!x%$rUlqz3V2B4&dQnt9iL"));
        logger.info("本次請(qǐng)求花費(fèi)時(shí)間:" + (endTime - startTime) + "ms");


        return jsonResponse;


    }
    
    
    
    /**
     * @description 解析gzip返回結(jié)果
     * @param 
     * @return
     * @throws 
     */
    public static String dealGzipResponse(HttpResponse response) throws IOException
    {
    logger.info("=======解析gzip返回結(jié)果==========");
    InputStream is = response.getEntity().getContent(); 
        GZIPInputStream  gzin = new GZIPInputStream(is);  
        
        InputStreamReader isr = new InputStreamReader(gzin,"UTF-8");   
        java.io.BufferedReader br = new java.io.BufferedReader(isr);  
        StringBuffer sb = new StringBuffer();   
        String tempbf;  
        while ((tempbf = br.readLine()) != null) {  
            sb.append(tempbf);  
        }  
        isr.close();  
        gzin.close();  
        
        return sb.toString();
    }
    


    public static void main(String[] args) throws Exception {
 
    String paString = "ZHUaLE300APPhAVGY83szZX4gt4o6O7yv4MQf_uXTe_i8CUJMxJ9CBAcEH8SrTND-6AyeCKX dsS3aZ4bjyqqspdxKhpmv8KOQJ17kJStfhu6wlpNJILUzMeXCa_bwabJajNH HWUrnbILbHHadpd9TkqV1gIuDgDdmJ4GebNjFoaqKfE1EouwG4Dk-ew-x6My nypnmUhELyArFwFOCA230TDvxUUNv4CQEzbwWXKkbon6";
        paString=URLEncoder.encode(paString);


        try {


        String result = sendJsonRequest("http://localhost/uip/property/findProperty.do",paString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    }

以上就是怎么實(shí)現(xiàn)APP HTTP接口報(bào)文的加密與壓縮的全部?jī)?nèi)容了,更多與怎么實(shí)現(xiàn)APP HTTP接口報(bào)文的加密與壓縮相關(guān)的內(nèi)容可以搜索億速云之前的文章或者瀏覽下面的文章進(jìn)行學(xué)習(xí)哈!相信小編會(huì)給大家增添更多知識(shí),希望大家能夠支持一下億速云!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI