[Spring] 14.SpringProject-리다이렉트
결과 페이지의 문제점 - 새로고침
저번 장에서 게시물 등록 페이지를 만들어 게시물을 등록해보았는데요~
한가지 문제점이 있습니다.
게시물을 등록한 후 새로고침을 누르게 되면 브라우저는 POST 방식으로 다시 한 번 데이터를 전송할 것인지 묻습니다!
만약 확인이 누르면 게시글이 정상적으로 등록되는데 이는 게시물 도배 현상을 일으키는 주범이됩니다!
이 문제를 해결하는 방법은 게시물을 등록하면 registPOST 실행 후 페이지를 다른 곳(다른 URI)로 이동시키는 것입니다!
바로 리다이렉트를 사용하는 것인데요~!
원래 보통 게시물을 등록하면 게시물 목록 페이지가 뜨죠? 저희도 registPOST가 끝나면 listAll 컨트롤러를 실행시켜 listAll.jsp 가 뜨게 리다이렉트 해보겠습니다!
다음과 같이 BoardController를 수정해줍니다!
//BoardController 일부
//수정
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerPOST(BoardVO board, Model model) throws Exception{
logger.info("register post.....");
logger.info(board.toString());
service.regist(board);
model.addAttribute("result", "registerOK");
//return "/board/success";
return "redirect:/board/listAll"; //리다이렉트
}
//추가
@RequestMapping(value = "/listAll", method = RequestMethod.GET)
public void listAll(Model model) throws Exception{
logger.info("show all list");
}
그리고 listAll.jsp도 다음과 같이 만들어줍니다!
<!-- listAll.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<table class="table table-bordered">
<tr>
<th style="width: 10px">BNO</th>
<th>TITLE</th>
<th>WRITER</th>
<th>REGDATE</th>
<th style="width: 40px">VIEWCNT</th>
</tr>
</table>
<%@include file="../include/footer.jsp" %>
그런다음 다시 Run on Server 해줍니다!
게시물을 등록하면 위와같이 listAll.jsp가 제대로 보여지는 것을 볼 수 있습니다!
이제 아무리 새로고침을 해봤자 계속 게시물 목록 페이지가 나오겠죠??
하지만 아직 문제가 있습니다 주소창에 보면 http:// localhost:8080/board/listAll?result=success와 같이 registPOST 에서 보낸 메시지가 그대로 URI에 노출됩니다~
새로고침을 해도 없어지지 않는데요~! 이문제를 해결하려면 Spring의 RedirectAttributes 객체를 이용해야합니다!
RedirectAttributes 를 이용한 숨김 데이터의 전송
RedirectAttributes 객체는 리다이렉트 시점에 한 번만 사용되는 데이터를 전송할 수 있는 addFlashAttributes()라는 기능을 지원합니다.
addFlashAttribute()는 브라우저까지 전송되기는 하지만 URI 상에는 보이지 않는 숨겨진 데이터의 형태로 전달됩니다.
다음과 같이 BoardController.java 의 registPosr를 수정합니다!
//BoardController.java
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerPOST(BoardVO board, RedirectAttributes rttr) throws Exception{
logger.info("register post.....");
logger.info(board.toString());
service.regist(board);
rttr.addFlashAttribute("result", "registerOK");
return "redirect:/board/listAll";
}
listAll.jsp에도 다음 script 문을 추가하여 게시물이 등록되면 경고창이 뜨게 하겠습니다~!
<!-- listAll.jsp -->
<script>
var result = '${result}';
if(result === 'registerOK'){
alert('등록이 완료되었습니다.');
}
</script>