반응형

일반적으로 Action 클래스에서는 다음과 같은 로직을 통해 중복 Form Submit 여부를 체크할 수 있다.

  • Action Class

    boolean valid = isTokenValid(request, true);
    if (valid) {
        // TODO: submit 할 때 수행할 로직을 넣을 것
        System.out.println("status: performed");
    } else {
        // TODO: init / reload 할 때 수행할 로직을 넣을 것
        System.out.println("status: initialized or reloaded");
    }
    saveToken(request);

  • JSP

    <input type="hidden" name="org.apache.struts.taglib.html.TOKEN" 
    value="<%= session.getAttribute(org.apache.struts.Globals.TRANSACTION_TOKEN_KEY) %>">

    UI(JSP, HTML)에서는 "org.apache.struts.taglib.html.TOKEN"을 Key로 하는 Hidden Field를 통해 할당된 Token 값을 서버로 전송하고, 해당 Action 클래스에서는 isTokenValid 메소드 호출을 통해 이 Token 값과 Session에 저장된 Token 값을 비교함으로써, Token의 유효성을 검사한다.

위에 소스에 대해 개괄적으로 설명하면 Action 을 처리하면서 saveToken(request); 부분에서
세션에 토큰키를 생성하여 저장하게 된다.(현재시간과 세션아이디를 가지고 MD5 알고리즘을 이용해 생성)

JSP페이지에서 이를 히든타입으로 form에 담게 되고 submit을 통해 Action으로 가면
현재 세션에 저장되어 있는 토큰키와 form에 담겨 request로 넘어온 토큰키와 비교를 하게 된다.
그 키값이 같으면 정상처리를 하게 되고 saveToken(request); 부분을 통해 신규 토큰키가 생성되고
세션에 다시 담기게 된다. 이후에 새로고침이나 뒤로가기를 통해 다시 넘어오는 토큰키는 이전에 처리된
토큰키를 그대로 담고 있기 때문에 새로 생성된 신규 토큰키와 다르므로 중복처리를 제어할수 있는것이다.

토큰에 관한 부분은 아래 링크에 상세히 설명되어 있고 jsp에 name은 명확히 동일하게 작성되어야 한다.
 
아래 링크에서 "56.3.1. Double Submit의 개념" 부분을 참고하도록 하자.
http://dev.anyframejava.org/docs/anyframe/4.6.0/reference/html/ch56.html

+ Recent posts