redirect, forward

OneTwoThree·2022년 9월 19일
0
post-thumbnail

리다이렉투

리다이렉트

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

response 객체는 내장객체로 선언되어 있으므로 jsp에서 스크립트릿으로 바로 response.sendRedirect 메소드를 호출한다.
인자로는 리다이렉트할 url을 전달한다.

redirect01.jsp url로 접속하면 redricet02.jsp url로 이동하게 된다.

브라우저에서 리다이렉트 확인


리다이렉트 시에는 클라이언트가 request를 두번 보내게 된다.

forward

포워드


servlet1이 처리한 내용을 가지고 servlet2가 추가로 처리하려면 servlet1과 servlet2가 모두 접근 가능한 것이 필요하다.
그 역할을 해주는 것이 HttpServletRequest 객체이다.

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int diceValue = (int)Math.random()*6+1;
		//setAttriute로 request  객체에 값을 저장한다. dice라는 이름으로 diceValue 값을 저장
		request.setAttribute("dice",diceValue);
		
		//import javax.servlet.RequestDispatcher 
		//getRequest이 인자로 어디로 포워딩할지 정한다. 주소는 /로 시작하고 같은 웹 어플리케이션 내에서만 포워딩할 수 있다. 
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next");
		requestDispatcher.forward(request,response);
	}

Servlet1의 service 메소드다.
request 객체에 setAttribute 메소드를 이용해서 dice 라는 이름으로 diceValue 값을 저장했다.
RequestDispatcher를 사용하기 위해 javax.servlet.RequestDispatcher를 import 해줬다.
RequestDispatcher를 이용해서 request와 response 객체를 포워딩해준다.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<html><head></head>");
		out.println("<body>");
		
		//Servlet1에서 저장한 값을 getAttrivute 메소드로 얻어온다. 
		int dice = (Integer)request.getAttribute("dice");
		out.println("dice : "+dice);
		out.println("</body></html>");
	}

Servlet2의 service 메소드다.
getAttribute 메소드를 이용해서 Servlet1에서 저장한 값을 찾는다.

실행해보면 Servlet2로 포워딩했지만 url은 그대로 Servlet1이다.

redricet와 forward의 차이

  • 리다이렉트 : url이 바뀐다. 클라이언트가 서버에게 2번 요청한다. 따라서 request와 response 객체도 2번 생선된다;
  • 포워드 : url이 바뀌지 않고 그대로다. 클라이언트는 눈치채치 못한다. 클라이언트가 서버에게 1번 요청한다. 따라서 request, response 객체도 한번만 생성된다.

0개의 댓글