使用deflate壓縮Cookie

00潤物無聲00發表於2017-03-06

  Cookie再HTTP的頭部,不能再壓縮HTTP Body時進行壓縮,但是Cookie可以把多個k/v看成普通文字,進行文字壓縮。

  Cookie壓縮之後進行轉碼,因為Cookie中不能有控制字元,只能包含ASCII碼(34-126)的可見字元;

//使用Deflater壓縮再進行BASE64編碼。
//Filter在頁面輸出時對Cookie進行全部或者部分壓縮
private void compressCookie(Cookie c,HttpServletResponse res)
{
	try
	{
		System.out.println("before compress length:" + c.getValue().getBytes().length);

		//
		//可以捕獲記憶體緩衝區的資料,這個類實現了一個輸出流,資料轉為位元組陣列,這個資料可以轉為toByteArray()和toString();
		ByteArrayOutputStream bos = null;
		bos = new ByteArrayOutputStream();
		//“deflate” 壓縮格式壓縮資料實現輸出流過濾器
		DeflaterOutputStream dos = new DeflaterOutputStream(bos);
		dos.write(c.getValue.getBytes());
		dos.close();
		//Base64編碼
		String compress = new sun.misc.BASE64Encoder().encode(bos.toByteArray());
		//新增到httpServletResponse中
		res.addCookie(new Cookie("compress",compress));
		System.out.println("after compress length:" + compress.getBytes().length);
	}catch(IOException e)
	{
		e.printStackTrace();
	}
}


//使用InflaterInputStream進行解壓
private void unCompressCookie(Cookie c)
{

	try
	{
		//可以捕獲記憶體緩衝區的資料,這個類實現了一個輸出流,資料轉為位元組陣列,這個資料可以轉為toByteArray()和toString();
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		//位元組型陣列
		//BASE64編碼
		byte[] compress = new sun.misc.BASE64Decoder()
		.decodeBuffer(new String(c.getValue().getBytes()));
		ByteArrayInputStream bis = new ByteArrayInputStream(compress);
		InflaterInputStream inflater = new InflaterInputSteam(bis);
		byte[] b = new byte[1024];
		int count;
		while((count = inflater.read(b))>0)
		{
			out.write(b,0,count);
		}

		inflater.close();
		System.out.println(out.toByteArray());
	}catch(Exception e)
	{
		e.printStackTrace();
	}
}

  DeflaterOutputStream對Cookie進行壓縮,Deflater壓縮之後BASE64編碼。

  同樣使用Deflater進行編碼然後,inflaterInputStream對Cookie進行解壓


相關文章