在Java Web開發(fā)中,請(qǐng)求轉(zhuǎn)發(fā)和重定向是兩個(gè)非常常用的技術(shù),本文將從概念、原理和實(shí)現(xiàn)三個(gè)方面來分析它們之間的區(qū)別。
概念
請(qǐng)求轉(zhuǎn)發(fā),即服務(wù)器將一次請(qǐng)求轉(zhuǎn)發(fā)給另外一個(gè)資源進(jìn)行處理,然后將資源處理的結(jié)果返回給客戶端,客戶端并不知道請(qǐng)求被轉(zhuǎn)發(fā)了。
// Java Servlet中的請(qǐng)求轉(zhuǎn)發(fā)示例代碼 request.getRequestDispatcher("/index.jsp").forward(request, response);
重定向,即服務(wù)器接收到一次請(qǐng)求后,將請(qǐng)求的URL地址重寫后再發(fā)送到客戶端進(jìn)行訪問,客戶端會(huì)重新發(fā)出請(qǐng)求。
// Java Servlet中的重定向示例代碼 response.sendRedirect("/index.jsp");
原理
請(qǐng)求轉(zhuǎn)發(fā)是在服務(wù)器內(nèi)部完成的,是一次真正的服務(wù)器內(nèi)部資源跳轉(zhuǎn),客戶端瀏覽器并不會(huì)得到跳轉(zhuǎn)后新的URL地址,因此對(duì)客戶端瀏覽器是透明的。
重定向是在客戶端完成的,當(dāng)客戶端瀏覽器接收到服務(wù)器端的重定向指令時(shí),會(huì)自動(dòng)發(fā)送新的請(qǐng)求,請(qǐng)求新的URL地址。
實(shí)現(xiàn)
請(qǐng)求轉(zhuǎn)發(fā)常常用于在一個(gè)Web應(yīng)用中的不同資源之間跳轉(zhuǎn),例如JSP頁(yè)面之間的跳轉(zhuǎn)等,常用的實(shí)現(xiàn)方式有以下兩種:
// Java Servlet中的請(qǐng)求轉(zhuǎn)發(fā)方法一 request.getRequestDispatcher("/index.jsp").forward(request, response); // Java Servlet中的請(qǐng)求轉(zhuǎn)發(fā)方法二 request.getRequestDispatcher("/index.jsp").include(request, response);
重定向常常用于資源跳轉(zhuǎn)時(shí)需要帶參數(shù)或者訪問跨域請(qǐng)求時(shí)使用,常用的實(shí)現(xiàn)方式有以下兩種:
// Java Servlet中的重定向方法一 response.sendRedirect("/index.jsp"); // Java Servlet中的重定向方法二 response.setStatus(302); // 狀態(tài)碼302表示重定向 response.setHeader("Location", "/index.jsp"); // Location表示重定向的地址
總的來說,請(qǐng)求轉(zhuǎn)發(fā)和重定向雖然實(shí)現(xiàn)方式不同,但都是實(shí)現(xiàn)Web資源跳轉(zhuǎn)的有效方法,需要根據(jù)具體情景來選擇使用。