怎么實現(xiàn)APPHTTP接口報文的加密與壓縮

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

創(chuàng)新互聯(lián)是專業(yè)的東港網(wǎng)站建設(shè)公司,東港接單;提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行東港網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

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

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

二: nginx 開啟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
語法: gzip on|off
默認(rèn)值: gzip off
作用域: http, server, location, if (x) location
開啟或者關(guān)閉gzip模塊

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

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

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

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

gzip_proxied
語法: 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作為反向代理的時候啟用,開啟或者關(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 - 無條件啟用壓縮

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


三:客戶端Http 請求及返回結(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請求,并返回結(jié)果
     * @param url
     *            請求地址
     * @param jsonRequest
     *            請求參數(shù)
     * @return jsonResponse 返回結(jié)果
     * @throws
     */
    public static String sendJsonRequest(String url, String jsonRequest)
            throws Exception {
    logger.info("請求URL:" + url);
        logger.info("請求參數(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ù)端可以對Response進(jìn)行GZip壓縮
        postMethod.setHeader("Accept-Encoding", "gzip, deflate");
        // 開始請求
        startTime = System.currentTimeMillis();
        HttpResponse response = httpClient.execute(postMethod);


        logger.info("status:"+response.getStatusLine().getStatusCode());
       
        // 讀取請求結(jié)果
        if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
            HttpEntity httpEntity = response.getEntity();
            //對gzip壓縮過的返回結(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("本次請求花費時間:" + (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();
        }
    }


    }

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

當(dāng)前題目:怎么實現(xiàn)APPHTTP接口報文的加密與壓縮
分享路徑:http://bm7419.com/article42/jjdphc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、微信公眾號、網(wǎng)站改版、域名注冊、面包屑導(dǎo)航、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計