본문 바로가기

Development/Java, JSP

재실행 막기.

트랜잭션 처리 후 재실행(F5키, 뒤로가기 버튼 등등)을 막기 위해서는 세션값을 체크해서 처리한다.

일단 로그인하면서 세션을 생성해서 저장하고,
JSP 페이지에

<input type="hidden" name="sessionToken" value="${sessionToken}" />

이렇게 세팅을 한다.

주의할 점은 sendRedirect.do 나 insertData.do 등의 모든 처리에서 세션값을 가져가야 한다.
대부분 sendRedirect.do 에서는 그냥 페이지만 이동하는 경우가 많다.
세션을 가져가느냐 아니냐에 따라서
sendRedirect.do / sendRedirectWithSession.do 이렇게 두개를 만들어서 사용하는것도 괜찮은 방법이다.

다음 컨트롤러에서

public void checkSessionAndResetToken(HttpServletRequest request) {
    HttpSession session = request.getSession();
    String sessionToken = (String) session.getAttribute("sessionToken");
    // Token 처리
    String formToken = request.getParameter("sessionToken");
    logger.debug("Form Token [{}], Session Token [{}] 으로 중복 요청을 확인합니다.", formToken, sessionToken);
    if (formToken == null || "".equals(formToken) || !sessionToken.equals(formToken)) {
     logger.debug("중복된 요청입니다. 요청을 처리할 수 없어서 예외를 던집니다.");
     DuplicatedRequestException exception = new com.skt.isf.management.exception.DuplicatedRequestException("중복된 요청입니다. 요청을 처리할 수 없습니다.");
     exception.setNextTarget("/sendRedirect.do?nextTarget=/isfadmin/info/manage.jsp");
     throw exception;
  }
  // Token 갱신
  request.getSession().setAttribute("sessionToken", JVMIDUtils.generateUUID());
 }

이런식으로 받아서 처리한다.
그리고 처리한 뒤에는

public void setSessionToken(HttpServletRequest request) {
    String uuid = JVMIDUtils.generateUUID();
    request.getSession().setAttribute("sessionToken", uuid);
    request.setAttribute("sessionToken", uuid);
 }

이렇게 다시 세션토큰을 설정한다.
사실 간단한 방법은 아니다.
보통은 세션을 세팅하는 JSP페이지를 만들어 놓고 사용하고자 하는 JSP 페이지 처음부분에 import해서 사용한다. 뭘 사용하느냐는 각자의 자유.