1 자바스크립트, 변수를 설정하고 한 번만 제출을 허용합니다.
<script 언어="javascript">
var checkSubmitFlg = false;
function checkSubmit() {
if (checkSubmitFlg == true) {
return false
}
checkSubmitFlg = true
}
document.ondblclick
= function docondblclick() {
window.event
.returnValue
= false;
}
document.onclick = function doconclick() {
if (checkSubmitFlg) {
window.event.returnValue = false
}
</script>
<html:form action="myAction.do" method="post" onsubmit="return checkSubmit();">
2 계속해서 javascript를 사용하여 제출 버튼이나 이미지를 비활성화하도록 설정합니다.
<html:form action="myAction.do" method ="post"
onsubmit="getElById('submitInput').disabled = true; return true;">
<html:image styleId="submitInput" src="images/ok_b.gif" border="0" />
< / html:form>
3 Struts의 동기화 토큰 메커니즘을 사용하여
웹 애플리케이션의 반복 제출 문제를 해결합니다. Struts는 참조 구현도 제공합니다.
기본 원칙:
들어오는 요청을 처리하기 전에 서버는 요청에 포함된 토큰 값을 현재 사용자 세션에 저장된 토큰 값과 비교하여 일치하는 항목이 있는지 확인합니다. 요청이 처리된 후 응답이 클라이언트에 전송되기 전에 새 토큰이 생성됩니다. 클라이언트에 전달되는 것 외에도 이 토큰은 사용자 세션에 저장된 이전 토큰을 대체합니다. 이러한 방식으로 사용자가 이전 제출 페이지로 돌아가서 다시 제출하는 경우 클라이언트가 전달한 토큰은 서버 측 토큰과 일치하지 않으므로 반복 제출을 효과적으로 방지할 수 있습니다.
if (isTokenValid(request, true)) {
// 여기에 있는 코드
return mapping.findForward("success");
} else {
saveToken(request);
return mapping.findForward("submitagain")
}
Struts는 사용자 세션을 기반으로 합니다
.ID 및 현재 시스템 시간은 각 세션에 대해 고유한 토큰을 생성하는 데 사용됩니다. 특정 구현은 TokenProcessor 클래스의 generateToken() 메서드를 참조하세요.
1. //트랜잭션 제어 토큰을 확인합니다. <html:form>은 이중 제출을
방지하기 위해 세션의 식별자를 기반으로 암시적 입력 대표 토큰을 자동으로 생성합니다.
//<input type="hidden" name ="org.apache.struts.taglib.html.TOKEN"
// value="6aa35341f25184fd996c4c918255c3ae">
if (!isTokenValid(request))
errors.add(ActionErrors.GLOBAL_ERROR,
new ActionError("error.transaction.token") ) ;
ResetToken(request); //세션
3에서 토큰을 삭제합니다. Action에는 토큰을 생성하는 메소드가 있습니다.
String generateToken(HttpServletRequest request) {
HttpSession session = request.getSession()
try {
byte id[] = session .getId ().getBytes();
byte now[] =
new Long(System.currentTimeMillis()).toString().getBytes();
MessageDigest
md = MessageDigest.getInstance("MD5")
md
.update(
now);
return (toHex(md.digest()));
} catch (IllegalStateException e) {
return
(null)
} catch (NoSuchAlgorithmException e) {
return (null)