突破wap網關限制
原因:就目前找到的資料wap網關限制大文件的下載,是因爲wap網關在手機客戶端拿到文件之前就已經知道要下載的文件大小,這是因爲文件的大小從http協議中可以得到,http頭中保存的不止文件的大小,還有文件的類型等一些列信息,按照現在的猜測,網關限制大文件下載是根據文件的content-length來判斷文件的大小。
解決思路:在wap網關和文件服務器之間加一層代理服務器,網關請求過來只到代理服務器,而不會到真正訪問到你的資源你服務器。代理服務器按照客戶端的請求參數每次去文件服務器上拿取文件。
技術關鍵點:
1. 代理服務器與文件服務器之間連接的建立
2. 輸入流和輸出流,字節偏移量的設定(代理服務器)
3. 代理服務器輸出文件類型
代碼實現:
public class DownServlet extends HttpServlet {
private static final long serialVersionUID = 1332534778678L;
private static final int byte_size = 1024;
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentLength(byte_size); // 輸出到客戶端的文件大小
String fileName = "default.dmh";
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment; filename="
+ fileName); // 設置文件頭
String url = request.getParameter("url");
URL fileUrl = new URL(url);
HttpURLConnection httpCon = (HttpURLConnection) fileUrl
.openConnection();
// System.out.println("before range.......... "+httpCon.getResponseCode());
String sProperty = "bytes=10-" + byte_size; // -後面表示要取多少數據
httpCon.setRequestProperty("RANGE", sProperty); // 設置偏移量
System.out.println("after range.......... "+httpCon.getResponseCode());
InputStream in = httpCon.getInputStream();
System.out.println("after InputStream.......... "+httpCon.getResponseCode());
DataInputStream dis = new DataInputStream(in); // 重新包裝輸入流
OutputStream out = response.getOutputStream(); // 從httpUrlConnecction中獲得輸出流
byte[] b = new byte[byte_size]; // 讀取多少
dis.read(b);
out.write(b);
out.flush();
out.close(); // 關閉輸入輸出流
dis.close();
in.close();
}
}
出現問題:
1. 設置偏移量對文件服務器不起作用
經過測試發現只有代理服務器請求文件服務器上的靜態文件時,設置偏移量才能使用,請求動態的則不行,猜測原因是請求動態的文件是因爲設置的一些底層的參數到不了服務器底層,如:apache等。
2. 設置偏移量“-”後的大小
“-”後設置多少表是此次請求從偏移量之後取多少數據,此過程會限制httpCon.getInputStream()的大小,在使用read讀取時讀取的大小就是“-”後的大小,若讀取過大則在後面補空格。
解決思路:在wap網關和文件服務器之間加一層代理服務器,網關請求過來只到代理服務器,而不會到真正訪問到你的資源你服務器。代理服務器按照客戶端的請求參數每次去文件服務器上拿取文件。
技術關鍵點:
1. 代理服務器與文件服務器之間連接的建立
2. 輸入流和輸出流,字節偏移量的設定(代理服務器)
3. 代理服務器輸出文件類型
代碼實現:
public class DownServlet extends HttpServlet {
private static final long serialVersionUID = 1332534778678L;
private static final int byte_size = 1024;
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentLength(byte_size); // 輸出到客戶端的文件大小
String fileName = "default.dmh";
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment; filename="
+ fileName); // 設置文件頭
String url = request.getParameter("url");
URL fileUrl = new URL(url);
HttpURLConnection httpCon = (HttpURLConnection) fileUrl
.openConnection();
// System.out.println("before range.......... "+httpCon.getResponseCode());
String sProperty = "bytes=10-" + byte_size; // -後面表示要取多少數據
httpCon.setRequestProperty("RANGE", sProperty); // 設置偏移量
System.out.println("after range.......... "+httpCon.getResponseCode());
InputStream in = httpCon.getInputStream();
System.out.println("after InputStream.......... "+httpCon.getResponseCode());
DataInputStream dis = new DataInputStream(in); // 重新包裝輸入流
OutputStream out = response.getOutputStream(); // 從httpUrlConnecction中獲得輸出流
byte[] b = new byte[byte_size]; // 讀取多少
dis.read(b);
out.write(b);
out.flush();
out.close(); // 關閉輸入輸出流
dis.close();
in.close();
}
}
出現問題:
1. 設置偏移量對文件服務器不起作用
經過測試發現只有代理服務器請求文件服務器上的靜態文件時,設置偏移量才能使用,請求動態的則不行,猜測原因是請求動態的文件是因爲設置的一些底層的參數到不了服務器底層,如:apache等。
2. 設置偏移量“-”後的大小
“-”後設置多少表是此次請求從偏移量之後取多少數據,此過程會限制httpCon.getInputStream()的大小,在使用read讀取時讀取的大小就是“-”後的大小,若讀取過大則在後面補空格。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.