본문 바로가기

Web

Redirect & Forward

Redirect란 ?

  • 서버가 클라이언트로부터 요청을 받은 후, 클라이언트에게 특정 URL로 이동하라고 요청하는 것
  • 리다이렉트는 http프로토콜로 정해진 규칙
  • 서버에서는 클라이언트에게 응답으로 상태코드 302와 함께 이동할 URL정보를 Location 헤더에 담아 전송 → 클라이언트는 서버로부터 받은 상태값이 302이면 Location헤더값으로 재요청을 보내개 됨 → 이때 브라우저의 주소창은 전송받은 URL로 바뀜
  • 서블릿이나 jsp는 redirect를 하기 위해서 HttpServletResponse가 가지고 있는 sendRedirect()메소드를 사용

Redirect 예제

1. eclipse → Dynamic Web Project 생성 → WebContent폴더에 redirect01.jsp 생성 : redirect02.jsp로 리다이렉트를 요청하는 코드 작성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
response.sendRedirect("redirect02.jsp");
%>

2. redirect02.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
redirect된 페이지 입니다

</body>
</html>

3. redirect01.jsp 실행 →  WAS의 redirect요청을 받아 redirect02.jsp요청

URL /redirect01.jsp → /redirect02.jsp로 변경됨

개발자도구의 Network를 보면 해당 기록이 보임

 

예제 동작 설명

 

Forward란?

클라이언트가 서버에게 어떤 요청을 보냈을 때, 서버(servlet1)가 요청을 받아 다른 서버(servlet2)에 넘겨주는 것. 이때 서버는 요청을 내부적으로 옮겨지기 때문에 새로운 요청을 보내는 것이 아님. request, response객체는 그대로 유지됨

 

 

  1. 웹 브라우제엇 Servlet1에게 요청을 보냄
  2. Servlet1은 요청을 처리한 후, 그 결과를 HttpServletRequest에 저장
  3. Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward)
  4. Servlet2는 Servlet1으로부터 받은 HttpServletRequest와 HttpServletResponse를 이용하여 요청을 처리한 후 웹 브라우저에 결과 전송

Redirect와 Forward의 차이?

  • redirect는 클라이언트가 서버에 요청을 보내면, 서버는 명령을 처리하고 다시 클라이언트에 새로 요청해야할 URL을 알려줌 → URL주소 변경.
  • forward는 클라이언트가 서버에 요청을 보내면, 서버쪽에서 다른 서버에게 요청을 넘기는 것임 → URL 변경 안됨. 
  • 실제 클라이언트가 서버에게 요청을 보내면 request, response 객체가 생성되고, 요청이 들어와 응답을 할때까지 두 객체는 유지됨.
    ▶ forward는 request, response 객체 1개 만들어지지만
    ▶ redirect는 요청이 여러번 왔다갔다 할 수 있기 때문에 request, response 객체가 여러개 생길 수 있음
    ▶ 즉, 가장 큰 차이점은 요청의 개수 !

 

Forward 예제

1. 2개의 서블릿 FrontServlet, NextServlet 작성 (url주소는 각각 /front, /next로 설정함)

※ 서블릿 생성시 메소드 모두 추가 못했을 때 : Source - Override/Implement Methods 통해 추가하기

FrontServlet 코드

package examples;

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 FrontServlet
 */
@WebServlet("/front")
public class FrontServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public FrontServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		int diceValue = (int)(Math.random()*6)+1;
		request.setAttribute("dice", diceValue);
		
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); // 어디로 이동할지(같은 웹 애플리케이션 내에서만)
		requestDispatcher.forward(request, response);	// request, response 반드시 넘겨주어야함
	}

}

NextServlet 코드 

package examples;

import java.io.IOException;
import java.io.PrintWriter;

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 NextServlet
 */
@WebServlet("/next")
public class NextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NextServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>form</title><head>");
		out.println("<body>");
		
		int dice = (Integer)request.getAttribute("dice");
		out.println("dice : " + dice);
		for(int i=0;i<dice;i++) {
			out.print("hello<br>");
		}
		
		out.println("</body>");
		out.println("</html>");
	}


}

 

2.  FrontServlet 실행

실행 결과

FrontServlet에서 랜덤값을 request에 맡기고 NextServlet으로 forward시킴 → request에 있던 값 얻어옴

Fowarding 시, URL 변화는 X

 

 

 

 

출처 

https://www.boostcourse.org/web316/lecture/19878?isDesc=false , https://www.boostcourse.org/web316/lecture/16705?isDesc=false , 

http://java.scwcd.jobs4times.com/Web-Container-Model.html 

'Web' 카테고리의 다른 글

Scope  (0) 2021.08.23
Servlet , JSP 연동하기 (forward)  (0) 2021.08.19
JSP 내장 객체  (0) 2021.08.02
[eclipse] 자바 웹 어플리케이션 생성 (+ Finish버튼 비활성화 시)  (0) 2021.08.01
JSP란?  (0) 2021.08.01