301重定向html代碼(html 重定向)
最近對接易企簽,需要在用戶簽署完后把簽名文件下載并存儲到我們自己的文件存儲中心,本來在測試環(huán)境和預(yù)發(fā)環(huán)境測試都都無問題,可是,上生產(chǎn)后,問題就來了
最開始下載文件的代碼很簡單
URL url = new URL(fileUrl);
InputStream is = url.openStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(is, baos);
測試環(huán)境中,易企簽給的文件地址可以直接返回文件流,這種方式就下載小文件自然就沒什么問題,可是,當發(fā)布到生產(chǎn)后,直接通過上面的代碼就只能獲取到下面這樣的代碼
pFound. Redirecting to a http://open.signit.cn/v1/file/public/resources/00941ed4-bd2a-4c82-8758-2eb3760b13ee?token=6777e9df-4068-4e57-9de3-37a9387f5170resourceName=h07Ah6zzLvtmQ6CL4s4D3qin.pdf/a/p
很明顯,給的文件地址不再像預(yù)發(fā)環(huán)境那般單純了,它會302重定向,這就不好意思了,上面的代碼不能用,需要加強一下代碼邏輯,判斷響應(yīng)狀態(tài)碼如果是302,再從請求頭Location中取地址進行數(shù)據(jù)流的獲取。正準備自己來處理的,突然想到項目中已經(jīng)引入了強大的Hutool工具包,然后一句代碼就OK了
byte[] fileByte = HttpUtil.downloadBytes(fileUrl);
展開全文
那么,為什么它一行代碼就可以處理這個難題呢?我們來大概的看一下,首先進入到downloadBytes中
public static byte[] downloadBytes(String url) {
return HttpDownloader.downloadBytes(url);
}
最終可以跟到HttpUtil.createGet這個方法中
public static HttpRequest createGet(String url, boolean isFollowRedirects) {
return HttpRequest.get(url).setFollowRedirects(isFollowRedirects);
}
this.httpConnection = HttpConnection
.create(this.url.toURL(this.urlHandler), this.proxy)//
.setConnectTimeout(this.connectionTimeout)//
.setReadTimeout(this.readTimeout)//
.setMethod(this.method)//
.setHttpsInfo(this.hostnameVerifier, this.ssf)//
// 定義轉(zhuǎn)發(fā)
.setInstanceFollowRedirects(this.maxRedirectCount 0)
// 流方式上傳數(shù)據(jù)
.setChunkedStreamingMode(this.blockSize)
// 覆蓋默認Header
.header(this.headers, true);
public HttpResponse execute(boolean isAsync) {
// 初始化URL
urlWithParamIfGet();
// 初始化 connection
initConnection();
// 發(fā)送請求
send();
// 手動實現(xiàn)重定向
HttpResponse httpResponse = sendRedirectIfPossible();
// 獲取響應(yīng)
if (null == httpResponse) {
httpResponse = new HttpResponse(this.httpConnection, this.charset, isAsync, isIgnoreResponseBody());
}
return httpResponse;
}
進行URL初始化后,手動設(shè)置重定向,其中maxRedirectCount是可重定向的次數(shù),默認是2次。
private HttpResponse sendRedirectIfPossible() {
if (this.maxRedirectCount 1) {
// 不重定向
return null;
}
// 手動實現(xiàn)重定向
if (this.httpConnection.getHttpURLConnection().getInstanceFollowRedirects()) {
int responseCode;
try {
responseCode = httpConnection.responseCode();
} catch (IOException e) {
// 錯誤時靜默關(guān)閉連接
this.httpConnection.disconnectQuietly();
throw new HttpException(e);
}
if (responseCode != HttpURLConnection.HTTP_OK) {
if (HttpStatus.isRedirected(responseCode)) {
setUrl(httpConnection.header(Header.LOCATION));
if (redirectCount this.maxRedirectCount) {
redirectCount++;
return execute();
}
}
}
}
return null;
}
其實它的實現(xiàn)方式也是上面我們提到的思路是一致的,通過遞歸方式去多次獲取返回的請求頭中的LOCATION地址,嘗試獲取最終的文件下載地址。現(xiàn)在這般簡便的工具類越發(fā)的多,我們在使用的同時也需要去學習工具類類的實現(xiàn)思路。這樣我們才不會越發(fā)被動。
掃描二維碼推送至手機訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。