달력

10

« 2017/10 »

  • 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
  • 31
  •  
  •  
  •  
  •  

'programming/java'에 해당되는 글 4

  1. 2014.07.18 SAX split the data element problem
  2. 2013.09.13 더블서밋방지 및 뒤로가기 후 서밋방지 Token Util(TokenMngUtil) (2)
  3. 2013.05.16 Javadoc Tutorial
  4. 2013.01.09 refactoring
2014.07.18 12:53

SAX split the data element problem programming/java2014.07.18 12:53


SAX

Simple API for XML

xml로 된 파일 및 문자를 해석할 수 있게 해주는 응용프로그램인터페이스(API).

SAX가 어떤 녀석인지, DOM과의 차이점은 무엇인지에 대해 많겠지만 얕은 지식으로 똥냄새나는 글 싸지르는거 보단

http://en.wikipedia.org/wiki/Simple_API_for_XML

위키 참고하는게 보는 분들 정신건강에 나을듯 싶어 따로 적진 않겠음.

간단하게 DOM의 경우 문서 단위로 해석하는 반면 SAX의 경우 line단위로 해석함.


SAX의 경우

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
31
32
33
34
35
36
// node 값 인식시 발생
    public void characters (char ch[], int start, int lengththrows SAXException{
        data = escapeData(ch, start, length);
        //개행, Tab, 캐리지리턴 문자 제외
        if(data.indexOf("\\n")==0 || data.indexOf("\\t")==0 || data.indexOf("\\r")==0){
            // System.out.println("  EVENT: " + data + " Deleted.");
        }else{
            /* SAX PARSER Character Buffer Size(2048)가 max초과시 초기화 되면서
                     data element가 split되는 현상 방어로직*/
            if(beforeBufferFilledSize != 2048){
                saxTempStr="";
            }
             // log.debug(nodeName);
             /* log.debug("Buffer Start Position:["+start+"],Character Length:{"
                      +length+ "},Start+Length:("+(start+length)+"),[Character:"+data+ ",saxTempStr:"
                      +saxTempStr+"]");*/ // DEBUG TEST용
             if((start+length)==2048){
                saxTempStr = data;
            }
            if(start==0&&beforeBufferFilledSize==2048){
                fullDataStr = saxTempStr+data;
                map.put(nodeName.trim(),fullDataStr.trim());
            }else{
                if(beforeNodeName.equals(nodeName)){
                    fullDataStr = map.get(nodeName).toString()+data;
                    map.put(nodeName.trim(),fullDataStr.trim());
                }else{
                    fullDataStr = data;
                    map.put(nodeName.trim(),fullDataStr.trim());
                }
                
            }
            beforeBufferFilledSize=(start+length);
            beforeNodeName=nodeName;
        }
    }
 

위와같이 characters 메쏘드로 node안의 element를 인식하는데,

이때 SAX parser의 경우 한번에 2048byte 만큼밖에 인식하지 못함.

물론, 2048을 다 채우고 나면 버퍼를 싹 비우고 다시 0부터 채워나감.

하지만 버퍼를 비우고 새로 채워나가는 과정에서 문제가 생김.


상황

1. 새로운 element 인식시 2045부터 채워질 차례

2. 새로 채워질 element의 경우 길이가 4일경우(ex>null)

3. 남은 여유분이 2048-2045 = 3으로 가용공간은 3

4. 이에 SAX의 경우 임의로 element를 3만큼 잘라버림

5. 이때 Programmer가 예측못한 상황이 발생되어 데이터의 정합성에 문제가 생김

 

예시(Problem)

-SAMPLE XML

<variable>null</variable>

-정상 CASE

start : 1196

length : 4

nodeName : variable

data(element) : null

-비정상 CASE(MAX BUFFER SIZE 2048 PROBLEM)

start : 2045

length : 3

nodeName : variable

data(element) : nul

start : 0

length : 1

nodeName : variable

data(element) : l

 

SOLUTION

위의 예시를 살펴보면 문제 상황에서 버퍼사이즈가 2048이후 0으로 초기화.

또한, nodeName이 동일하게 리턴되는 것을 확인할 수 있음.

이에,

1. 이전 버퍼사이즈가 2048이고 버퍼 시작이 0인 경우이전 텍스트와 현재 characters 메쏘드에서 인식된 텍스트를 붙여줌.

2. 1번케이스가 아니라고 하더라도(saxParser의 경우 line by line으로 분석하지만 xml리딩이 순차적이지 않아, 문제상황이 1번케이스에 걸리지 않을 수도 있음) 이전 nodeName과 현재 nodeName이 같은 경우 문제 상황이라고 보고 1번과 같은 처리.


 


Thx for advice

http://rb-techtips.blogspot.kr/2012/08/sax-2048-byte-issue-on-java-xml-parsing.html

신고

'programming > java' 카테고리의 다른 글

SAX split the data element problem  (0) 2014.07.18
더블서밋방지 및 뒤로가기 후 서밋방지 Token Util(TokenMngUtil)  (2) 2013.09.13
Javadoc Tutorial  (0) 2013.05.16
refactoring  (0) 2013.01.09
Posted by insummersnow

TokenMngUtil.java

 
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package framework.util;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
 
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
 
 
public class TokenMngUtil {
    private static final String TOKEN_KEY   = "TOKEN_KEY";
    private static final Logger logger = Logger.getLogger(TokenMngUtil.class.getName());
 
    /**
     * 로직처리를 위해 세션과 request에 Token 생성
     * 
     * @param request
     */
    public static void saveToken(ModelAndView mv, HttpServletRequest request) {
        HttpSession session = request.getSession(true);
        long systemTime = System.currentTimeMillis();
        byte[] time = new Long(systemTime).toString().getBytes();
        byte[] id = session.getId().getBytes();
         
        try {
            MessageDigest SHA = MessageDigest.getInstance("SHA-256");
            SHA.update(id);
            SHA.update(time);
 
            String token = Base64.encodeBase64(SHA.digest()).toString();
            request.setAttribute(TOKEN_KEY, token);
            session.setAttribute(TOKEN_KEY, token);
            
            mv.addObject(TOKEN_KEY, token);
            
            logger.error("#########################################################################");
            logger.error("# Generate Token Key Value = " + token + " #");
            logger.error("#########################################################################");
             
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 로직처리 이후 중복방지를 위해 세션의 Token 초기화
     * 
     * @param request
     */
    public static void resetToken(HttpServletRequest request) {
        HttpSession session = request.getSession(true);
 
        try {
            session.removeAttribute(TOKEN_KEY);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 세션과 request의 Token이 동일한지 비교
     * 
     * @param request
     * @return
     */
    public static boolean isTokenValid(HttpServletRequest request) {
        HttpSession session = request.getSession(true);
        String requestToken = request.getParameter(TOKEN_KEY);
        String sessionToken = (String) session.getAttribute(TOKEN_KEY);
 
        if (requestToken == null || sessionToken == null) {
            return false;
        } else {
            return requestToken.equals(sessionToken);
        }
    }
}
 

 

 

 

 

TOKEN_KEY generate

 
1
2
    /* 중복방지 Token 생성 */
    TokenMngUtil.saveToken(mv, req);

 

 

 

 

TOKEN_KEY check & session value delete

 
1
2
3
4
5
6
7
    if(!TokenMngUtil.isTokenValid(req)){
       log.error("잘못된 접근입니다. 중복방지 Token error");
        ifsr.addString("resultCode""Token_error");
       return ifsr;
    }
    /*중복방지 Token 초기화*/
    TokenMngUtil.resetToken(req);

 

 

 

 

TOKEN_KEY parameter setting

 
1
2
    <input type="hidden" name="TOKEN_KEY" id="TOKEN_KEY" value="${TOKEN_KEY}" />    
    <%-- 중복방지 token parameter --%>

 

 

 

 

신고

'programming > java' 카테고리의 다른 글

SAX split the data element problem  (0) 2014.07.18
더블서밋방지 및 뒤로가기 후 서밋방지 Token Util(TokenMngUtil)  (2) 2013.09.13
Javadoc Tutorial  (0) 2013.05.16
refactoring  (0) 2013.01.09
Posted by insummersnow
2013.05.16 14:08

Javadoc Tutorial programming/java2013.05.16 14:08


JavadocTutorial.pdf



For More Info on Javadoc visit:

Sun’s Website - http://java.sun.com/j2se/javadoc/writingdoccomments/

Source Forge Java Workshop - http://javaworkshop.sourceforge.net/chapter4.html#Javadoc+Comments

신고

'programming > java' 카테고리의 다른 글

SAX split the data element problem  (0) 2014.07.18
더블서밋방지 및 뒤로가기 후 서밋방지 Token Util(TokenMngUtil)  (2) 2013.09.13
Javadoc Tutorial  (0) 2013.05.16
refactoring  (0) 2013.01.09
Posted by insummersnow
2013.01.09 11:15

refactoring programming/java2013.01.09 11:15

겉으로 드러나는 코드의 기능은 바꾸지 않으면서 내부 구조를 개선하는 방식으로 소프트웨어 시스템을 

수정하는 과정으로서 코드를 알아보기 쉽고 수정하기 좋게 만드는 작업


- MARTIN FOWLER_Refactoring 에서 발췌



ps. 이정도로만 알아두고 나머지는 책을 통해 감각적으로 개념을 익힐것 인터넷에 나도는 장황한 설명따위 필요없음.

신고

'programming > java' 카테고리의 다른 글

SAX split the data element problem  (0) 2014.07.18
더블서밋방지 및 뒤로가기 후 서밋방지 Token Util(TokenMngUtil)  (2) 2013.09.13
Javadoc Tutorial  (0) 2013.05.16
refactoring  (0) 2013.01.09
Posted by insummersnow