一:間接請求轉發(Redirect)
注:http 400是提交信息的格式不對
間接轉發方式,有時也叫重定向,它一般用於避免用戶的非正常訪問。例如:用戶在沒有登錄的情況下訪問後臺資源,Servlet可以將該HTTP請求重定向到登錄頁面,讓用戶登錄以後再訪問。在Servlet中,通過調用response對象的SendRedirect()方法,告訴瀏覽器重定向
//Servlet中處理get請求的方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//請求重定向到另外的資源
response.sendRedirect("資源的URL");
}
//可以將addemp的請求返回到emp/list頁面
@GetMapping("/emps")
public String list(Model model) {
Collection<Employee> employees = employeeDao.getAll();
//放在請求域中共享
model.addAttribute("emps", employees);
return "emp/list";
}
@PostMapping("addemp")
public String addemp(Employee employee) {
//添加完成之後直接回到list頁面
// redirect表示重定向到一個地址(請求) /代表當前項目路徑
// forward 表示轉發到一個地址
return "redirect :/emps";
}
- 瀏覽器向Servlet1發出訪問請求;
- Servlet1調用sendRedirect()方法,將瀏覽器重定向到Servlet2;
- 瀏覽器向servlet2發出請求;
- 最終由Servlet2做出響應。
二:直接請求轉發(Forward)
一般說的請求轉發指的就是直接轉發方式。Web應用程序大多會有一個控制器。由控制器來控制請求應該轉發給那個信息資源。然後由這些信息資源處理請求,處理完以後還可能轉發給另外的信息資源來返回給用戶,這個過程就是經典的MVC模式
......
//Servlet裏處理get請求的方法
public void doGet(HttpServletRequest request , HttpServletResponse response){
//獲取請求轉發器對象,該轉發器的指向通過getRequestDisPatcher()的參數設置
RequestDispatcher requestDispatcher =request.getRequestDispatcher("資源的URL");
//調用forward()方法,轉發請求
requestDispatcher.forward(request,response);
}
......
- 瀏覽器向Servlet1發出訪問請求;
- Servlet1調用forward()方法,在服務器端將請求轉發給Servlet2;
- 最終由Servlet2做出響應。
直接轉發和間接轉發的原理及區別是什麼?
答:Forward和Redirect代表了兩種請求轉發方式:直接轉發和間接轉發。對應到代碼裏,分別是RequestDispatcher類的forward()方法和HttpServletRequest類的sendRedirect()方法。
對於間接方式,服務器端在響應第一次請求的時候,讓瀏覽器再向另外一個URL發出請求,從而達到轉發的目的。它本質上是兩次HTTP請求,對應兩個request對象。
對於直接方式,客戶端瀏覽器只發出一次請求,Servlet把請求轉發給Servlet、HTML、JSP或其它信息資源,由第2個信息資源響應該請求,兩個信息資源共享同一個request對象。
注意post請求要想返回到另一個get請求的servlet要通過間接轉發請求!!!