中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么通過httpclient比較重定向和請求轉發

發布時間:2023-04-14 11:58:43 來源:億速云 閱讀:241 作者:iii 欄目:開發技術

本篇內容主要講解“Java怎么通過httpclient比較重定向和請求轉發”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java怎么通過httpclient比較重定向和請求轉發”吧!

這里介紹一下:HttpClient 4.x 版本,get請求方法會自動進行重定向,而post請求方法不會自動進行重定向,這是要注意的地方。我上次發生錯誤,就是使用post提交表單登錄,當時沒有自動重定向。

請求轉發和重定向的區別

1、重定向是兩次請求,轉發是一次請求,因此轉發的速度要快于重定向。

2、重定向之后地址欄上的地址會發生變化,變化成第二次請求的地址,轉發之后地址欄上的地址不會變化,還是第一次請求的地址。

3、轉發是服務器行為,重定向是客戶端行為。重定向時瀏覽器上的網址改變 ,轉發是瀏覽器上的網址不變。

4、重定向是兩次request,轉發只有一次請求。

5、重定向時的網址可以是任何網址,轉發的網址必須是本站點的網址。

這里重點看第三條和第四條。

HTTP報文包含響應碼、響應頭和響應體。 這里只說 200 和 302. 響應碼:2xx(一般是200)。表示請求成功,然后就可以接受響應的數據。 響應碼:3xx(一般為302)。表示重定向,服務器會要求客戶端重新發送一個請求,服務器會發送一個響應頭 Location,它指定了新請求的 URL 地址。(這里很重要!客戶端需要通過 Location 頭,獲取重定向的地址。

這里并沒有提及請求轉發,因為請求轉發是一種服務器端的操作,它是在服務器內部進行操作的,所以就是一次請求(在客戶端看和普通的請求沒有區別)。而重定向不同,它是客戶端的操作,因為服務器要求客戶端重新發送一次請求,所以重定向是兩次請求。這也解釋了為什么重定向后請求參數會丟失,因為根本不是一次請求。我這里說客戶端,并不說瀏覽器,因為我們有時不一定會使用瀏覽器作為客戶端,比如爬蟲也是是一個客戶端了。

但是,對于剛開始學習的時候,或者對于普通用戶來說,似乎感覺不出來二者的區別,最多是可以發現瀏覽器地址是否改變。請求轉發瀏覽器地址不變,而重定向瀏覽器地址會變化為新的地址。(但是在這個過程中并未體現重定向的兩次請求,這是因為瀏覽器自動幫我們進行了重定向。)

下面以Java編程來看看二者的區別:上面的第三條和第四條

Java web 部分

TestServlet 類

提供一個簡單的 Servlet 類,它的功能和簡單,它會攜帶一個 key 參數,如果該參數存在且值為 “1”,那么就進行請求轉發到 “/dispatcher.jsp” 頁面;否則,就重定向到 “redirect.jsp” 頁面。

package com.study;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String key = request.getParameter("key");
		if((key != null && key.equals("1"))) {
			System.out.println("請求轉發:key " + key);
			//請求轉發
			request.getRequestDispatcher("/dispatcher.jsp").forward(request,response);
		}else {
			//重定向
			response.sendRedirect("redirect.jsp");
			System.out.println("重定向:key " + key);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

dispacher.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>請求轉發</title>
</head>
<body>
<h2>請求轉發</h2>
</body>
</html>

redirect.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>重定向</title>
</head>
<body>
<h2>重定向</h2>
</body>
</html>

啟動項目測試

我這里的目的主要是請求轉發和重定向的訪問區別,并不是比較它們二者的其它區別,所以示例很簡單。

測試請求地址:http://localhost:8080/study/TestServlet?key=1

注意:請求地址無變化。

Java怎么通過httpclient比較重定向和請求轉發

測試請求地址:http://localhost:8080/study/TestServlet?key=2 注意:請求地址發生了變化。

Java怎么通過httpclient比較重定向和請求轉發

這樣的話,是看不出來二者在訪問上有什么區別的,但是看不到,不代表它們沒有區別,下面通過代碼來查看二者在訪問方式上的區別。

使用 HttpClient

  • 301 Moved Permanently(永久移動)

  • 302 Found(發現)

  • 303 See Other(查看其他)

  • 307 Temporary Redirect(臨時重定向)

由于 HttpClient 4.x 版本會自動重定向,所以我們必須關閉自動重定向,才能跟蹤重定向的過程。

在 RequestConfig 里面設置,并設置超時時間(三個)。

//HttpClient4.3中默認允許自動重定向,導致程序中不能跟蹤跳轉情況。
int timeout = 10*1000;
RequestConfig config = RequestConfig.custom()
		.setSocketTimeout(timeout)
		.setConnectTimeout(timeout)
		.setConnectionRequestTimeout(timeout)
		.setRedirectsEnabled(false)   //關閉自動重定向,默認值為true。
		.build();

然后發送請求時,設置并允許自動重定向。

//創建get請求對象
HttpGet getMethod = new HttpGet(url);
//設置請求方法關閉自動重定向
getMethod.setConfig(config);  //配置信息

這樣當我們訪問路徑為:http://localhost:8080/study/TestServlet?key=1

服務器會進行請求轉發,但是這是服務器行為,與客戶端沒有關系,所以我們不用關心,在請求正確的情況下,響應碼為 200。

測試結果:

Java怎么通過httpclient比較重定向和請求轉發

當我們訪問路徑為:http://localhost:8080/study/TestServlet?key=2,服務器會要求客戶端進行重定向(即要求客戶端請求另一個地址),這時會先收到狀態碼 302,當再次訪問成功時狀態碼為 200(當然了,也許重定向不止一次,但是瀏覽器會對重定向次數有限制)。

如果發生了重定向,我們需要獲取響應頭中的 Location 字段,這里面是重定向的地址。

//讀取新的 URL 地址
Header header = response.getFirstHeader("location");
String newUrl = header.getValue();

注意:重定向是可以訪問服務器外的地址的,服務器內部的地址一般是相對地址,需要拼接 URL,服務器外就是絕對 URL 了。

測試結果:

Java怎么通過httpclient比較重定向和請求轉發

完整測試代碼

package com.learn;

import java.io.IOException;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.ParseException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class TestRedirect {
	
	/**
	 * 重定向是客戶端操作,而請求轉發是服務端操作 。
	 * 但是通常用戶使用瀏覽器,并不注意二者的區別,
	 * 這是因為瀏覽器自動幫我們重定向了。(當然了,
	 * 編程還是需要注意的)。
	 * @throws IOException 
	 * @throws ParseException 
	 * */
	public static void main(String[] args) throws ParseException, IOException {
		String root = "http://localhost:8080/study/";  //網站的根路徑,因為重定向得到的是相對路徑(服務器內部的路徑)
		
		//HttpClient4.3中默認允許自動重定向,導致程序中不能跟蹤跳轉情況。
		int timeout = 10*1000;
		RequestConfig config = RequestConfig.custom()
				.setSocketTimeout(timeout)
				.setConnectTimeout(timeout)
				.setConnectionRequestTimeout(timeout)
				.setRedirectsEnabled(false)   //關閉自動重定向,默認值為true。
				.build();
		
		
		String url = "http://localhost:8080/study/TestServlet?key=1";  //請求轉發。
		
		//創建 httpclient 對象
		CloseableHttpClient httpClient = HttpClients.createDefault();
		//創建get請求對象
		HttpGet getMethod = new HttpGet(url);
		getMethod.setConfig(config);  //配置信息
	
		//執行請求,得到響應信息
		try (CloseableHttpResponse response = httpClient.execute(getMethod)) {
			HttpEntity entity = null;
			int statusCode = response.getStatusLine().getStatusCode();
			System.out.println("返回值狀態碼:" + statusCode);
			if (statusCode == HttpStatus.SC_OK) {  
				//獲取請求轉發的實體信息
				entity = response.getEntity();
				if (entity != null) {
					System.out.println(EntityUtils.toString(entity, "UTF-8"));
				}
			} else if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
				
				//讀取新的 URL 地址
				Header header = response.getFirstHeader("location");
				System.out.println(header);
				if (header != null) {
					String newUrl = header.getValue();
					if (newUrl != null && !newUrl.equals("")) {
						//使用get方法轉向。
						HttpGet redirectGet = new HttpGet(root+newUrl);
						System.out.println("重定向到新的地址:" + redirectGet.getURI());
						redirectGet.setConfig(config);
						//發送請求,做進一步處理。。。
						try (CloseableHttpResponse redirectRes = httpClient.execute(redirectGet)) {
							statusCode = redirectRes.getStatusLine().getStatusCode();
							System.out.println("返回值狀態碼:" + statusCode);
							if (statusCode == HttpStatus.SC_OK) {  
								//獲取請求轉發的實體信息
								entity = redirectRes.getEntity();
								if (entity != null) {
									System.out.println(EntityUtils.toString(entity, "UTF-8"));
								}
							}
						}
					}
				}
			} 
		}
	}
}

到此,相信大家對“Java怎么通過httpclient比較重定向和請求轉發”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

民乐县| 吉木乃县| 顺平县| 綦江县| 阳曲县| 宁乡县| 景宁| 祁连县| 临夏县| 隆子县| 扶绥县| 永安市| 迁西县| 阜宁县| 宜丰县| 桓仁| 收藏| 阿城市| 开原市| 临朐县| 儋州市| 晋江市| 佳木斯市| 方正县| 霍城县| 江华| 安义县| 东丰县| 西贡区| 上饶县| 兰坪| 宁波市| 民勤县| 原平市| 桂平市| 东辽县| 蕲春县| 鄂托克旗| 黄平县| 安义县| 祁阳县|