웹 개발 기초/자바 웹을 다루는 기술

HttpServletRequest를 이용한 redirect 포워딩 시 바인딩

sungw00 2023. 2. 18. 20:40
728x90

브라우저에서 전달받은 request를 서블릿에서 redirect 방식으로 다른 서블릿에 전달하는 경우

// FirstServlet.java
package sec04.ex01;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
 * Servlet implementation class FirstServlet
 */
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("FirstServlet init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("FirstServlet destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		request.setAttribute("address", "서울시 강서구");
		response.sendRedirect("second");
	}

}

HttpServletRequest의 setAttribute( ) 메서드를 이용해 (address, "서울시 강서구")를 바인딩

// SecondServlet.java
package sec04.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
 * Servlet implementation class SecondServlet
 */
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		System.out.println("SecondServlet init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("SecondServlet destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		String name = request.getParameter("name");
		String address = (String)request.getAttribute("address");
		out.println("<html><body>");
		out.println("주소:" + address);
		out.println("<br>");
		out.println("redirect를 이용한 바인딩 실습입니다.");
		out.println("</body></html>");
	}

}

getAttribute( ) 메서드를 이용해 전달된 주소를 받음

실행 결과에서 '서울시 강서구'가 출력되지 않고 null이 출력되는 이유 ?

redirect 방식의 포워드 과정 1단계인 웹 브라우저에서 요청할 때 서블릿에 전달되는 첫 번째 request는 웹 브라우저를 통해 재요청되는 3단계의 두 번째 request와 다른 요청이기 때문. 즉, redirect 방식으로는 서블릿에서 바인딩한 데이터를 다른 서블릿으로 전송하는 것이 불가능함

 

물론 GET 방식으로 전송하는 것은 가능할지라도 전달하고자 하는 데이터가 보안과 상관 없고 데이터의 양이 적다면 GET 방식으로 전송해도 상관없다. 하지만 데이터베이스에서 조회된 수십 개의 회원 정보나 상품 정보 전달에는 redirect 방식이 부적절하다.

 

해결법: dispatch 방법을 이용하여 바인딩한 데이터를 전달하기

728x90