[Spring] 리다이렉트 / 포워드 차이

merci·2023년 1월 16일
2

Spring

목록 보기
4/21

리다이렉트와 포워드에 차이를 명확하게 구분하자

@Controller
public class ProductController {

    @Autowired
    private HttpSession session;

    @GetMapping("/test")
    public String test(){
        return "test";
    }
    
    // 리다이렉트 - request 객체 사용
    @GetMapping("/redirect")
    public void requestTest(HttpServletRequest request,
    	HttpServletResponse response) throws IOException{
        request.setAttribute("name2", "request metacoding");   
        response.sendRedirect("/test");  
        	// request객체에 데이터 넣었지만 브라우저가 다시 요청 함
            // 새로운 request객체가 test.jsp 로 포워딩 된다. ( null )
    }
    
    // 리다이렉트 - session 객체 사용
    @GetMapping("/redirect2")
    public void sessionTest(HttpServletRequest request,
   		HttpServletResponse response, HttpSession session) throws IOException{
        session.setAttribute("name2", "session metacoding");        
        response.sendRedirect("/test");		// 세션에 저장해서 데이터 유지 
        			// 세션이 30분동안 유지되기 때문에 (디폴트) 이후 /test쳐도 데이터 나옴
    }
    
    // 포워딩 - request 객체 사용
    @GetMapping("/dispatcher")
    public void forwardTest(HttpServletRequest request,
    	HttpServletResponse response) throws ServletException, IOException {
        request.setAttribute("name2", "forward metacoding");
        RequestDispatcher dis = request.getRequestDispatcher("/test");
        dis.forward(request, response);
    }
}

test.jsp

<body>
    <h1>test page  ${name2}</h1>
</body>




request.setAttribute("name2", "forward metacoding");
RequestDispatcher dis = request.getRequestDispatcher("/test");
        dis.forward(request, response);

request 객체를 @GetMapping("/test") 로 포워딩 + /test 에서 한번 더 포워딩 되므로
덮어쓰고 덮어쓴 request 객체에서 데이터를 꺼내면 위처럼 결과가 나온다


세션은 30분간 유지 ( 디폴트 ) http://localhost:8080/test 결과가 위처럼 나온다.

profile
작은것부터

1개의 댓글

comment-user-thumbnail
2023년 1월 20일

리다이렉트 포워드 차이 덕분에 잘 알고 갑니다.
그런디... 차이나타운은 어떤 차이가 있어서 차이나타운인가요?

답글 달기