이중등록(Double Submit) 방지 컴포넌트 문의
- 작성자 :
- 박*식
- 작성일 :
- 2015-01-29 18:31:31
- 조회수 :
- 1,662
- 구분 :
- 공통컴포넌트
- 진행상태 :
- 완료
Q
며칠 전에 게시판 중복등록 문제에 답변 주신대로
게시판에 이중등록 방지 컴포넌트를 적용해봤는데
EgovDoubleSubmitHelper에서 해당파라미터가 빈 값으로 체크되어 게시물이 등록되지 않고,
Controller에서 디버깅을 해봐도 form value가 request.getParameter 구문을 사용하면 전혀 조회되지 않습니다.
html 소스보기를 하면 UUID도 정상적으로 생성되어 있고,
form의 content-type을 multipart/form-data로 처리한 것도 아닌데 form value를 받지 못하는 이유를 모르겠습니다.
수정한 소스는 다음과 같습니다.
[EgovNoticeRegist.jsp]
<form:form commandName="board" name="board" method="post" >
<double-submit:preventer/>
<input type="hidden" name="pageIndex" id="pageIndex" title="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>"/>
<input type="hidden" name="bbsId" id="bbsId" title="bbsId" value="<c:out value='${bdMstr.bbsId}'/>" />
<input type="hidden" name="bbsAttrbCode" id="bbsAttrbCode" title="bbsAttrbCode" value="<c:out value='${bdMstr.bbsAttrbCode}'/>" />
..중략..
</form:form>
[브라우저에서 확인 한 html 소스]
<form name="board" id="board" action="/cop/bbs/addBoardArticle.do" method="post">
<input name="egovframework.double.submit.preventer.parameter.name" type="hidden" value="2A32EE5D-7927-4094-A1A8-1B80E6995795"/>
<input name="pageIndex" title="pageIndex" id="pageIndex" type="hidden" value="1"/>
<input name="bbsId" title="bbsId" id="bbsId" type="hidden" value="BBSMSTR_000000000021"/>
<input name="bbsAttrbCode" title="bbsAttrbCode" id="bbsAttrbCode" type="hidden" value="BBSA03"/>
..중략..
</form>
[EgovBBSManageController]
@RequestMapping("/cop/bbs/insertBoardArticle.do")
public String insertBoardArticle(
HttpServletRequest request,
@ModelAttribute("searchVO") BoardVO boardVO,
@ModelAttribute("bdMstr") BoardMaster bdMstr,
@ModelAttribute("board") Board board,
BindingResult bindingResult,
SessionStatus status,
ModelMap model) throws Exception {
// 디버깅을 위해 입력한 코드
System.out.println("pageIndex"+ request.getParameter("pageIndex"));
System.out.println("bbsId"+ request.getParameter("bbsId"));
System.out.println("bbsAttrbCode"+ request.getParameter("bbsAttrbCode"));
.... 중략...
if (EgovDoubleSubmitHelper.checkAndSaveToken()) {
bbsMngService.insertBoardArticle(board);
model.addAttribute("message", egovMessageSource.getMessage("success.common.insert"));
}
... 이하 생략...
이상과 같습니다.
원인이 무엇인지 답변 부탁드리겠습니다.
게시판에 이중등록 방지 컴포넌트를 적용해봤는데
EgovDoubleSubmitHelper에서 해당파라미터가 빈 값으로 체크되어 게시물이 등록되지 않고,
Controller에서 디버깅을 해봐도 form value가 request.getParameter 구문을 사용하면 전혀 조회되지 않습니다.
html 소스보기를 하면 UUID도 정상적으로 생성되어 있고,
form의 content-type을 multipart/form-data로 처리한 것도 아닌데 form value를 받지 못하는 이유를 모르겠습니다.
수정한 소스는 다음과 같습니다.
[EgovNoticeRegist.jsp]
<form:form commandName="board" name="board" method="post" >
<double-submit:preventer/>
<input type="hidden" name="pageIndex" id="pageIndex" title="pageIndex" value="<c:out value='${searchVO.pageIndex}'/>"/>
<input type="hidden" name="bbsId" id="bbsId" title="bbsId" value="<c:out value='${bdMstr.bbsId}'/>" />
<input type="hidden" name="bbsAttrbCode" id="bbsAttrbCode" title="bbsAttrbCode" value="<c:out value='${bdMstr.bbsAttrbCode}'/>" />
..중략..
</form:form>
[브라우저에서 확인 한 html 소스]
<form name="board" id="board" action="/cop/bbs/addBoardArticle.do" method="post">
<input name="egovframework.double.submit.preventer.parameter.name" type="hidden" value="2A32EE5D-7927-4094-A1A8-1B80E6995795"/>
<input name="pageIndex" title="pageIndex" id="pageIndex" type="hidden" value="1"/>
<input name="bbsId" title="bbsId" id="bbsId" type="hidden" value="BBSMSTR_000000000021"/>
<input name="bbsAttrbCode" title="bbsAttrbCode" id="bbsAttrbCode" type="hidden" value="BBSA03"/>
..중략..
</form>
[EgovBBSManageController]
@RequestMapping("/cop/bbs/insertBoardArticle.do")
public String insertBoardArticle(
HttpServletRequest request,
@ModelAttribute("searchVO") BoardVO boardVO,
@ModelAttribute("bdMstr") BoardMaster bdMstr,
@ModelAttribute("board") Board board,
BindingResult bindingResult,
SessionStatus status,
ModelMap model) throws Exception {
// 디버깅을 위해 입력한 코드
System.out.println("pageIndex"+ request.getParameter("pageIndex"));
System.out.println("bbsId"+ request.getParameter("bbsId"));
System.out.println("bbsAttrbCode"+ request.getParameter("bbsAttrbCode"));
.... 중략...
if (EgovDoubleSubmitHelper.checkAndSaveToken()) {
bbsMngService.insertBoardArticle(board);
model.addAttribute("message", egovMessageSource.getMessage("success.common.insert"));
}
... 이하 생략...
이상과 같습니다.
원인이 무엇인지 답변 부탁드리겠습니다.
A
안녕하세요. 박준식님.
이중등록 방지에 대한 처리는 정상적으로 적용하신 것 같습니다.
다만, html 소스 상에 정상적으로 token(egovframework.double.submit.preventer.parameter.name)이 생성되었으나 Controller 상세 request.getParameter()로 정보를 못 가지고 오는 것은 다른 문제이신 것 같습니다.
다른 파라미터들도 정상적으로 가져오지 못하는 경우 같습니다.
이 경우 JSP 처리 상에서 <form>이 하나가 아니라 여러 개인 경우 등의 request 자체에 문제가 있지 않은 경우에는 발생되지 않을 문제로 판단되기 때문에 JSP 처리 상의 정상적으로 처리되는지 확인 부탁드립니다.
추가적으로 EgovDoubleSubmitHelper 내부 처리 상에서 RequestContextHolder를 통해 request 정보를 가져오도록 되어 있는데, DispatcherServlet를 사용한 경우에는 문제가 없지만, 혹 DipatcherServlet 처리가 안되는 경우라면
web.xml 상에 다음과 같은 Listener를 등록해 보시면 됩니다. (일반적인 경우에는 등록할 필요 없음)
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
그럼, 즐거운 하루되십시오.
감사합니다.
이중등록 방지에 대한 처리는 정상적으로 적용하신 것 같습니다.
다만, html 소스 상에 정상적으로 token(egovframework.double.submit.preventer.parameter.name)이 생성되었으나 Controller 상세 request.getParameter()로 정보를 못 가지고 오는 것은 다른 문제이신 것 같습니다.
다른 파라미터들도 정상적으로 가져오지 못하는 경우 같습니다.
이 경우 JSP 처리 상에서 <form>이 하나가 아니라 여러 개인 경우 등의 request 자체에 문제가 있지 않은 경우에는 발생되지 않을 문제로 판단되기 때문에 JSP 처리 상의 정상적으로 처리되는지 확인 부탁드립니다.
추가적으로 EgovDoubleSubmitHelper 내부 처리 상에서 RequestContextHolder를 통해 request 정보를 가져오도록 되어 있는데, DispatcherServlet를 사용한 경우에는 문제가 없지만, 혹 DipatcherServlet 처리가 안되는 경우라면
web.xml 상에 다음과 같은 Listener를 등록해 보시면 됩니다. (일반적인 경우에는 등록할 필요 없음)
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
그럼, 즐거운 하루되십시오.
감사합니다.