WEB專案-使用重定向完成登入功能(轉發和重定向的區別)
阿新 • • 發佈:2019-01-10
使用重定向
使用狀態碼302和location頭完成重定向
程式碼:
@WebServlet("/demo3") public class ServletDemo3 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //向班長借錢 System.out.println("去找富班長"); //返回沒錢 response.setStatus(302); //找富班長 重定向地址:客戶端的絕對路徑(包含專案名稱) response.setHeader("location", "/Servlet/demo4"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
@WebServlet("/demo4") public class ServletDemo4 extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //找到富班長 System.out.println("富班長:借錢"); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
特點:訪問的是demo3,但是最終位址列變成了demo4。所以這是一次重定向是兩次請求和兩次響應。
使用重定向完成登陸頁面
需求:判斷登入的html頁面的使用者名稱和密碼是否都是admin,如果是,登入成功,如果不是,登陸失敗(重定向到登入頁面)
/** * 處理登陸功能(重定向) * @author 58351 * */ @WebServlet("/login") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //先從客戶端接收使用者床過來的資料 String username = request.getParameter("username"); String password = request.getParameter("password"); //判斷使用者名稱和密碼是否都是admin //如果都是admin,登入成功 否則登入失敗,重定向到登入頁面 if("admin".equals(username)&&"admin".equals(password)){ //登入成功 response.setStatus(302); response.setHeader("location", "/Servlet/html/success.html"); } else{ //登入失敗 //重定向 response.setStatus(302); response.setHeader("location", "/Servlet/html/login.html"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }
response物件提供了一個方法直接完成重定向功能:sendRedirect(String location);
使用轉發
使用轉發從一個Servlet轉發到另一個Servlet
RequestServlet1
package com.request;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RequsetDemo1
*/
@WebServlet("/request1")
public class RequsetDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//訪問request1,轉發到request2
//獲取RequestDispatcher物件
RequestDispatcher dispatcher = request.getRequestDispatcher("/request2");
//使用forward方法轉發
dispatcher.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
RequestDemo2
package com.request;
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;
/**
* Servlet implementation class RequestDemo2
*/
@WebServlet("/request2")
public class RequestDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向頁面輸出內容
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("轉發成功");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
重定向和轉發的區別
1、重定向時位址列會發生變化,轉發的位址列不會發生變化
2、重定向是兩次請求和兩次響應,轉發是一次請求和一次響應
3、重定向不能使用request域傳遞值,轉發可以,因為一次請求會建立一個新的request物件,而重定向中有兩次請求,會生成新的request物件
4、重定向的路徑中有專案名(/Servlet/request2),轉發的路徑中沒有專案名(/request)
5、重定向可以定向到任何頁面(網路上的資源),轉發只能在Web應用內部