1. 程式人生 > >WEB專案-使用重定向完成登入功能(轉發和重定向的區別)

WEB專案-使用重定向完成登入功能(轉發和重定向的區別)

使用重定向

使用狀態碼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應用內部