티스토리 뷰
리다이렉트 (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란?
- 웹 브라우저에서 Servlet1에게 요청을 보냄
- Servlet1은 요청을 일정영역 처리한 후, 그 결과를 HttpServletRequest에 저장
- Servlet1은 결과가 저장된 HttpServletRequest와 응답을 위한 HttpServletResponse를 같은 웹 어플리케이션 안에 있는 Servlet2에게 전송(forward), 이렇게 넘겨주는 작업을 포워드(foward)라고 부른다.
- 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 |
- Total
- Today
- Yesterday
- 파이썬 리스트
- 자바스크립트 그래프
- 파이썬 진수 변환
- 웹
- 파이썬 for
- 파이썬 클래스
- 파이썬
- 파이썬 예제
- 백준 1874
- 자바
- 파이썬 선택문
- 버츄어박스
- 파이썬 문자열
- 파이썬 while
- 백준 11501
- 파이썬 단계적 개선
- 파이썬 if문
- 자바 에센셜 실습문제
- 파이썬 객체
- 파이썬 터틀
- 파이썬 함수
- css
- 파이썬 연산자
- 명품 c++ 실습
- 자료구조
- 백준
- 백준 10451
- css 박스
- 자바스크립트 자료구조
- css 그리드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |