1. 程式人生 > >day02(後端實習)重定向和請求

day02(後端實習)重定向和請求

1、簡述重定向和請求轉發的定義
(客戶端行為)重定向的定義:
客戶瀏覽器傳送http請求----》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器–》客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址----》伺服器根據此請求尋找資源併發送給客戶。在這裡location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

(伺服器行為)請求轉發的定義:
客戶瀏覽器傳送http請求----》web伺服器接受此請求–》呼叫內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源傳送給客戶;在這裡,轉發的路徑必須是同一個web容器下的url

,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

在這裡插入圖片描述

2、請求抓發和重定義的例子:
前端程式碼:
login_success.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<h1>登入成功33!!!</h1>

</body>
</html>

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form action="login">
		賬號: <input type="text"  name="username"/><br>
		密碼: <input type="text"  name="password"/><br>
		<input type="submit"  value="登入"/><br>
	
	</form>

</body>
</html>

後端程式碼:

package com.itheima.servlet;

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


public class LoginServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html;charset=UTF-8");
		
		String userName = request.getParameter("username");
		String password = request.getParameter("password");
		
		if("admin".equals(userName) && "123".equals(password)){
			//response.getWriter().write("登入成功");
			/*
			 * 早期的寫法:
			 * response.setStatus(302);
			response.setHeader("Location", "login_success.html");*/
			
			//重定向寫法: 重新定位方向  /根目錄 ,則需要請求至少兩次
			response.sendRedirect("login_success.html");
			
			
			//請求轉發的寫法:只需要請求一次
//			request.getRequestDispatcher("login_success.html").forward(request, response);
		}else{
			response.getWriter().write("登入失敗");
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}