您好,登錄后才能下訂單哦!
今天給大家介紹一下怎么實(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ī)則及流程
二: 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í),希望大家能夠支持一下億速云!
免責(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)容。