티스토리 뷰

웹/부스트코스

[WEB]redirect, foward

cll179 2018. 6. 27. 14:34

리다이렉트 (redirect)

  • 리다이렉트는 HTTP프로토콜로 정해진 규칙이다.
  • 서버는 클라이언트의 요청에 대해 특정 URL로 이동을 요청할 수 있다. 이를 리다이렉트라고 한다.
  • 서버는 클라이언트에게 HTTP 상태코드 302로 응답하는데 이때 헤더 내 Location 값이동할 URL 추가한다. 클라이언트는 리다이렉션 응답을 받게 되면 헤더(Location)에 포함된 URL로 재요청을 보내게 된다. 이때 브라우저의 주소창은 새 URL로 바뀌게 된다..
  • 클라이언트는 서버로부터 받은 상태 값이 302이면 Location헤더값으로 재요청을 보내게 된다. 이때 브라우저의 주소창은 전송받은 URL로 바뀌게 된다.
  • 서블릿이나 JSP는 리다이렉트하기 위해 HttpServletResponse 클래스의 sendRedirect() 메소드를 사용한다.

 

 

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

  • 크롬에서 우측버튼을 누르고 검사를 선택한 후 Network탭을 선택한다.
  • redirect01.jsp를 실행하면 서버로부터 응답코드로 302를 받는 것을 알 수 있다.

 

 

 

 

 

*redirect01.jsp

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

 

*redirect02.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
redirect된 페이지 입니다.
</body>
</html>
cs

 

리다이렉트은 브라우저가 요청을 2번 보내는 것이다.

 

 

===============================================================

 

forward란?

 

  1. 웹 브라우저에서 Servlet1에게 요청을 보냄
  2. Servlet1은 요청을 일정영역 처리한 후, 그 결과를 HttpServletRequest에 저장
  3. Servlet1은 결과가 저장HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward), 이렇게 넘겨주는 작업을 포워드(foward)라고 부른다.
  4. Servlet2는 Servlet1으로 부터 받은 HttpServletRequest HttpServletResponse를 이용하여 요청을 처리한 후브라우저에게 결과를 전송

 

*redirect와 forward 둘의 개념을 확실히 구분하기!

- redirect는 어떤 일을 처리하고 다시 클라이언트에게 새로운 요청할 url을 주는 것, 그리고 새로 받은 url로 요청을 보내는 것. URL이 바뀌게 된다. 각각의 두 요청(request)과 반응(response)객체서로 다른 객체이다.

 

- forward는 혼자서 처리하는 것이 아니라, 다른 백한테 처리를 맡기는 것. 이 때 클라이언트는 이 과정에 관여할 필요 X. 그래서 URL이 바뀌지 않는다. 하나요청(request)과 반응(reponse) 객체로 작업이 진행된다.

 

 

 

*forward 실습

- 다음의 2개의 서블릿을 작성 : FrontServlet, NextServlet

- http://localhost:8080/forward/front

위 URL이 호출되면 FrontServlet이 실행됨.

FrontServlet에서는 랜덤한 주사위 값을 구하고, 그 값을 NextServlet에 포워드(forward)

NextServlet에서는 FrontServlet으로 부터 전달받은 주사위 값 만큼 hello 출력

 

FrontServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package example;
 
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;
 
@WebServlet("/front")
public class FrontServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public FrontServlet() {
        super();
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int diceValue = (int) (Math.random() * 6+ 1;  // 주사위 굴리기
        request.setAttribute("dice", diceValue);         // request 객체에 맡기기
 
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/next"); // requestDispatcher객체를 이용, ""안에
                                                                                        // 이동할 경로 넣어주기, 포워드할 경로는 무조건 /로 시작
                                                                                        // 같은 어플리케이션에서만 작동
        requestDispatcher.forward(request, response);   // forward 메소드에 request, response 객체 넘겨주기
    }
 
}
cs

 

NextServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package example;
 
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;
 
@WebServlet("/next")
public class NextServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
 
    public NextServlet() {
        super();
    }
 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        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");    //request객체에 맡겼던 dice 되찾아 오기, 오브젝트 타입으로 맡겼기 때문에, integer로 형변환 해서 꺼내온다.
        out.println("dice : " + dice);
        for(int i = 0; i < dice; i++) {
            out.print("<br>hello");
        }
        out.println("</body>");
        out.println("</html>");
    }
 
}
 
cs

 

* 실행 시키면 url은 바뀌지 않은 채 실행이 이루어 진다

 

참고 사이트 : http://www.edwith.org/



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.

 

 

' > 부스트코스' 카테고리의 다른 글

[WEB]scope  (0) 2018.06.27
[WEB] servlet & jsp연동  (0) 2018.06.27
[WEB] JSP 내장 객체  (0) 2018.06.04
[WEB]JSP 문법  (0) 2018.06.04
[WEB]Ajax통신의 이해  (0) 2018.06.03
댓글