일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 스프링게시판만들기
- 톰캣시작페이지설정
- 스프링게시판등록
- 컨트롤러url
- 스프링게시판목록조회
- 스프링게시판insert
- 스프링게시판상세보기
- Java
- 이클립스db연결
- HTML
- insert할글깨짐
- 게시판만들기
- 게시판상세보기
- double-submit
- url설정
- 이클립스데이터베이스연결
- mybatis연결
- 스프링프로젝트
- 게시판목록조회
- 전자정부프레임워크 double-submit
- 한글깨짐해결방법
- insert 중복방지
- 톰캣9.0다운로드
- dataSource설정
- Could not create the java Virtual Machine
- oracle
- 게시판insert
- 자바스크립트
- mysqlinsert한글깨짐
- 저장할때한글깨짐
- Today
- Total
하루의 일상💜
[전자정부프레임워크] 이중등록(Double submit) 방지 기능 사용해보기 본문
이중등록(Double Submit) 방지
전자정부프레임워크에서 제공하는 Double Submit 기능을 insert 폼에 적용해볼 것이다.
insert가 될때 새로고침 등의 중복 request 호출 시 등록 처리 등에 대한 이중 등록을 방지하는 기능이다.
https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:com:v3:cmm:doublesubmit
egovframework:com:v3:cmm:doublesubmit [eGovFrame]
새로고침 등의 중복 request 호출 시 등록 처리 등에 대한 이중 등록을 방지하는 기능을 제공한다. 세션을 통해 고유한 token을 보관하고 해당 token을 파라미터와 비교함으로서 중복 처리를 방지한
www.egovframe.go.kr
전자정부프레임워크 사용방법을 참고하여 적용하였다.
나는 all-in-one 프로젝트를 참고하여 파일을 추가해주었다.
아래의 코드를 추가해줘도 됨
DoubleSubmitTag.java
package egovframework.com.cmm.taglibs;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import egovframework.com.cmm.util.EgovDoubleSubmitHelper;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* TagSupport to support to double submit preventer
* @author Vincent Han
* @since 2014.08.07
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2014.08.07 표준프레임워크센터 최초 생성
*
* </pre>
*/
public class DoubleSubmitTag extends TagSupport {
private static final Logger LOGGER = LoggerFactory.getLogger(DoubleSubmitTag.class);
/**
* Generated Serial Version UID
*/
private static final long serialVersionUID = 5242217605452312594L;
private String tokenKey = EgovDoubleSubmitHelper.DEFAULT_TOKEN_KEY;
public String getTokenKey() {
return tokenKey;
}
public void setTokenKey(String tokenKey) {
this.tokenKey = tokenKey;
}
@SuppressWarnings("unchecked")
public int doStartTag() throws JspException {
StringBuilder buffer = new StringBuilder();
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
HttpSession session = request.getSession();
Map<String, String> map = null;
if (session.getAttribute(EgovDoubleSubmitHelper.SESSION_TOKEN_KEY) == null) {
map = new HashMap<String, String>();
session.setAttribute(EgovDoubleSubmitHelper.SESSION_TOKEN_KEY, map);
} else {
map = (Map<String, String>) session.getAttribute(EgovDoubleSubmitHelper.SESSION_TOKEN_KEY);
}
// First call (check session)
if (map.get(tokenKey) == null) {
map.put(tokenKey, EgovDoubleSubmitHelper.getNewUUID());
LOGGER.debug("[Double Submit] session token created({}) : {}", tokenKey, map.get(tokenKey));
}
buffer.append("<input type='hidden' name='").append(EgovDoubleSubmitHelper.PARAMETER_NAME).append("' value='").append(map.get(tokenKey)).append("'/>");
try {
pageContext.getOut().print(buffer.toString());
} catch (IOException e) {
throw new JspTagException("Error: IOException while writing to the user");
}
return SKIP_BODY;
}
}
EgovDoubleSubmitHelper.java
package egovframework.com.cmm.util;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
/**
* Utility class to support to double submit preventer
* @author Vincent Han
* @since 2014.08.07
* @version 1.0
* @see
*
* <pre>
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2014.08.07 표준프레임워크센터 최초 생성
*
* </pre>
*/
public class EgovDoubleSubmitHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(EgovDoubleSubmitHelper.class);
public final static String SESSION_TOKEN_KEY = "egovframework.double.submit.preventer.session.key";
public final static String PARAMETER_NAME = "egovframework.double.submit.preventer.parameter.name";
public final static String DEFAULT_TOKEN_KEY = "DEFAULT";
public static String getNewUUID() {
return UUID.randomUUID().toString().toUpperCase();
}
public static boolean checkAndSaveToken() {
return checkAndSaveToken(DEFAULT_TOKEN_KEY);
}
public static boolean checkAndSaveToken(String tokenKey) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpSession session = request.getSession();
// check session...
if (session.getAttribute(EgovDoubleSubmitHelper.SESSION_TOKEN_KEY) == null) {
throw new RuntimeException("Double Submit Preventer TagLig isn't set. Check JSP.");
}
String parameter = request.getParameter(EgovDoubleSubmitHelper.PARAMETER_NAME);
// check parameter
if (parameter == null) {
throw new RuntimeException("Double Submit Preventer parameter isn't set. Check JSP.");
}
@SuppressWarnings("unchecked")
Map<String, String> map = (Map<String, String>) session.getAttribute(EgovDoubleSubmitHelper.SESSION_TOKEN_KEY);
if (parameter.equals(map.get(tokenKey))) {
LOGGER.debug("[Double Submit] session token ({}) equals to parameter token.", tokenKey);
return true;
}
LOGGER.debug("[Double Submit] session token ({}) isn't equal to parameter token.", tokenKey);
return false;
}
}
여러가지 환경설정을 해보다가 servlet2.4 이상은 double-submit.tld를 등록하지 않아도 된다는 글을 봤는데
에러가 발생하여서 설정을 해줘야만 했다.
META-INF/double-submit.tld를 인식해주기 위해서는 web.xml에 추가 설정을 해줘야 한다.
아래 코드를 web.xml에 추가로 작성을 해준 후 META-INF/double-submit.tld 경로에 추가를 해준다.
web.xml
<web-app>
<jsp-config>
<taglib>
<taglib-uri>http://www.egovframe.go.kr/tags/double-submit/jsp</taglib-uri>
<taglib-location>/META-INF/double-submit.tld</taglib-location>
</taglib>
</jsp-config>
</web-app>
double-submit.tld
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.3</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>double-submit</short-name>
<uri>http://www.egovframe.go.kr/tags/double-submit/jsp</uri>
<tag>
<name>preventer</name>
<tag-class>egovframework.com.cmm.taglibs.DoubleSubmitTag</tag-class>
<attribute>
<name>tokenKey</name>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
이제 폼에서 submit을 보낼때 token을 생성시켜주는 코드를 추가해준다.
앞서 설정한 DoubleSubmitTag.java에서 설정한 코드 덕분에 insert 폼이 불러와질때 아래 코드로 인해서 랜덤 토큰이 생성이 된다.
//상단에 tag url 추가
<%@ taglib prefix="double-submit" uri="http://www.egovframe.go.kr/tags/double-submit/jsp" %>
//폼안에 추가
<double-submit:preventer tokenKey="tokenKey"/>
<form id="insertForm" name="insertForm" method="post" action="/insertBbs.do" enctype="multipart/form-data">
<double-submit:preventer tokenKey="tokenKey"/>
<label>제목</label>
<input type="text" id="title" name="title" value="${bbsVO.title}"/><br/>
<label>내용</label>
<textarea name="content" id="content">${bbsVO.content}</textarea><br/>
<input type="submit" id="save" value="등록"/>
</form>
insert Form이 불러올때 랜덤으로 생성되는 tokenkey
form에서 생성되었던 토큰 값을 저장될때 중복 여부에 대해 비교하기 위해 컨트롤러에 아래처럼 코드만 추가해주면 된다.
EgovDoubleSubmitHelper.checkAndSaveToken() 메소드에서 내부적으로 현재 기록된 세션상의 UUID와 파라미터의 UUID 값이 같은지 비교 후, 동일한 경우 새로운 UUID를 세션 상에 기록한 후 return true로 처리된다. 새로운 UUID가 세션에 변경되었기 때문에 동일한 request가 재 호출시 세션의 UUID와 이전 파라미터의 UUID 값이 다르기 때문에 return false로 처리되어 실제 등록 처리 등을 생략할 수 있다.
//전자정부프레임워크 출처
Controller
@RequestMapping(value = "/insertBbs.do", method = RequestMethod.POST)
public String insertBbs(@RequestParam Map<String, Object> commandMap
) throws Exception {
// 중복 제출 체크
if (EgovDoubleSubmitHelper.checkAndSaveToken("tokenKey")) {
bbsService.insertBbs(commandMap);
}
}
return "redirect:/bbsList.do";
}
if (EgovDoubleSubmitHelper.checkAndSaveToken("tokenKey")) {
}
세션의 토큰값과 파라미터의 토큰값을 비교하여 return false로 처리되면서 여러번 insert 요청을 보냈을 경우에도
하나의 값만 저장이 된다.
'전자정부프레임워크' 카테고리의 다른 글
[게시판만들기] 게시판목록 클릭 시 상세보기 (0) | 2024.03.06 |
---|---|
[게시판만들기] 게시글 등록하기 (0) | 2024.03.05 |
[게시판만들기] 게시글목록 조회하기 (1) | 2024.02.29 |
[게시판만들기] MyBatis, MySQL DB연결 (0) | 2024.02.29 |
[게시판만들기] 컨트롤러 통하여 .do로 jsp 열기/jsp:forward (1) | 2024.02.15 |