SpringMVC 어노테이션 Controller 에서 ModelAndView 를 이용하여 redirect 했을때 문제가 발생한 경우를 보았다.

문제 발생 상황은 Oracle varchar2(4000) 상황에서 약 2000바이트 문자열의 데이터를 쓰기 할때 쓰기를 정상적으로 완료 후 list 페이지로 redirect 하는 순간 브라우저 오류가 발생했다.(HTTP 에러가 아님)(forward는 정상)

또한, DB insert는 Exception 없이 정상 처리되었다. 

해결방법은 아래와 같았다.
setExposeModelAttributes 함수의 기능은 잘 이해되지 않는다..(HTTP 변수 노출여부 라는데..)


RedirectView rv = new RedirectView("list.do?param=1");
rv.setExposeModelAttributes(false);
return new ModelAndView(rv); 

[2011-06-12] 추가
Redirect 할 경우 Model의 값들이 URL에 Parameter값이 붙을경우 위와 같이 하면 Parameter 을 없앨수 있다. 


		int myNumber = 1234567;
		
		// 화폐단위로 변환
		String s = String.format("%,d원", myNumber);
		System.out.println("s: " + s);
		
		// 자리수 마추기
		s = String.format("%010d", 1234567);
		System.out.println("s: " + s);


Class Object를 이용하여 해당 Object 정보 얻기
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ClassInfo {

	public static void main(String[] args) {
		try {
			Class c = Class.forName("domain.VoClass");
			Method m [] = c.getDeclaredMethods();
			Field f [] = c.getDeclaredFields();
			
			System.out.println(f.length);
			for (int i = 0; i < f.length; i++)
				System.out.println(f[i].toString());
			
			System.out.println(m.length);
			for (int i = 0; i < m.length; i++)
				System.out.println(m[i].toString());
			
		} catch (Throwable e) {
			System.err.println(e);
		}
	}

}

[Server]

HelloWord.java
import java.util.HashMap;
import java.util.Map;

public class HelloWorld {

	public HelloWorld() {
	}

	public String getHelloWorld(String name, int value) {
		return "Hello World to " + name + "(" + value + ")";
	}
	
	public Map getHashMap(String name, String value) {
		Map map = new HashMap();
		map.put("string", name);
		map.put("int", value); 
		return map;
	}
}


두 인터페이스 함수를 만들고 HelloWord.java 파일을 HelloWord.jws 로 파일을 변경한다.


[Client]

ClientTest.java
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class ClientTest {

	public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
		Service service = new Service();
		Call call = (Call)service.createCall();
		call.setTargetEndpointAddress(new URL("http://localhost:8081/TEST_AXIS/HelloWorld.jws"));
		call.setOperationName(new QName("http://soapinterop.org/", "getHelloWorld"));
		String returnValue = (String)call.invoke(new Object[]{"String Test", 1});
		System.out.println(returnValue);
		
		call.setOperationName(new QName("http://soapinterop.org/", "getHashMap"));
		Map returnMap = (Map)call.invoke(new Object[]{"test1", "test1"});
		System.out.println(returnMap);
	}

}


아래와 같이 테스트도 가능
http://localhost:8081/TEST_AXIS/HelloWorld.jws?method=getHelloWorld&name=2342352345&value=1
http://localhost:8081/TEST_AXIS/HelloWorld.jws?method=getHashMap&name=2342352345&value=1


[Server Auth]
AuthTest.java
public class AuthTest {
	public String getString(String value){
		return "auth test: " + value;
	}
}


[Client Auth]
ClientAuthTest.java
import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;


public class ClientAuthTest {

	public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
		Service service = new Service();
		Call call = (Call)service.createCall();
		call.setTargetEndpointAddress(new URL("http://localhost:8081/TEST_AXIS/auth/AuthTest.jws"));
		
		call.setUsername("wsuser");
		call.setPassword("wspwd");
		
		call.setOperationName(new QName("http://soapinterop.org/", "getString"));
		String returnValue = (String)call.invoke(new Object[]{"String Test"});
		System.out.println(returnValue);
	}
}

tomcat-users.xml
// $TOMCAT_HOME/cont/tomcat-users.xml 추가



web.xml
// 해당 Context/web.xml 에 추가

	
		
			Protected
      		
      		/auth/*
		
   
		
			
			wsuser
		
	

	
	
		BASIC
		Protected Web Services
	

패키지는 java 파일에서 지정하지 않고, jws 파일만 해당 디렉토리에 저장하여 접근한다.
예) http://localhost:8081/TEST_AXIS/auth/AuthTest.jws?method=getString&value=11

java 파일이 없거나 jar일 경우, 즉 class 만 있을 경우 jws 방법을 이용할 수 없다.
그럴 경우 wsdl 을 생성하는 방법으로 해결 한다.
굳이 jws 방법으로 해야 한다면 해당 jar 및 class 를 사용하는 interface java를 생성하여 처리하면 되겠다.

참고자료
http://www.ibm.com/developerworks/kr/library/ws-sec1.html
http://cafe251.daum.net/_c21_/bbs_search_read?grpid=19VVx&fldid=Ki0S&contentval=00008zzzzzzzzzzzzzzzzzzzzzzzzz&nenc=rZc2_1ntyEMM3NSIvBc.2w00&dataid=8&fenc=w5lwmbf1XmU0&docid=CDb9MIhS

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

	/**
	 * SHA256 암호화 문자열로 변환
	 * @param value
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String encryptSHA256(String value) throws NoSuchAlgorithmException{
		String encryptData = "";
		
		MessageDigest sha = MessageDigest.getInstance("SHA-256");
		sha.update(value.getBytes());

		byte[] digest = sha.digest();
		for (int i=0; i<digest.length; i++) {
			encryptData += Integer.toHexString(digest[i] & 0xFF).toUpperCase();
		}
		
		return encryptData;
	}
	
	/**
	 * MD5 암호화 문자열로 변환
	 * @param value
	 * @return
	 * @throws NoSuchAlgorithmException
	 */
	public static String encryptMD5(String value) throws NoSuchAlgorithmException{
		String encryptData = "";
		
		MessageDigest sha = MessageDigest.getInstance("MD5");
		sha.update(value.getBytes());

		byte[] digest = sha.digest();
		for (int i=0; i<digest.length; i++) {
			encryptData += Integer.toHexString(digest[i] & 0xFF).toUpperCase();
		}
		
		return encryptData;
	}

	Connection conn = null;
	PreparedStatement  pstmt  = null;
	ResultSet  rs   = null;
	
	try{
		
		conn = .............
		
		String sql = "";
		
		int 	t_int = 1;
		String 	t_clob = "clob data 한글 입력";
		
		sql =  " insert into  test_clob (t_int, t_clob)values(?, ?) ";
		pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, t_int);
		pstmt.setAsciiStream(2, new ByteArrayInputStream(t_clob.getBytes()), t_clob.getBytes().length);
		int result = pstmt.executeUpdate();
		out.print("
result: " + result); sql = " select * from test_clob "; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); if( rs.next() ){ do{ InputStream is2 = rs.getAsciiStream(2); StringBuffer sb = new StringBuffer(); if( is2 != null ){ byte[] b = new byte[4096]; for (int n; (n = is2.read(b)) != -1;) { sb.append(new String(b, 0, n)); } } out.print("
int: " + rs.getInt(1) + " | clob: " + sb); }while( rs.next() ); } }catch(Exception e){ out.print("
e: " + e); }
String xmlStr = "<?xml version=\"1.0\" encoding=\"euc-kr\" ?>";
xmlStr += "<root>";
xmlStr += 	"<header>";
xmlStr += 		"<data>";
xmlStr += 			"<이름>ddakker</이름>";
xmlStr += 			"<날짜>2010-09-03</날짜>";
xmlStr += 			"</data>";
xmlStr += 		"<data>";
xmlStr += 			"<금액>2원</금액>";
xmlStr += 			"<안녕>hi</안녕>";
xmlStr += 		"</data>";
xmlStr += 	"</header>";
xmlStr += 	"<body>";
xmlStr += 		"<data>";
xmlStr += 			"<순번>1</순번>";
xmlStr += 			"<계좌>12-34</계좌>";
xmlStr += 			"<금액>10원</금액>";
xmlStr += 			"<거래점>양재</거래점>";
xmlStr += 		"</data>";
xmlStr += 		"<data>";
xmlStr += 			"<순번>2</순번>";
xmlStr += 			"<계좌>56-78</계좌>";
xmlStr += 			"<금액>20원</금액>";
xmlStr += 			"<거래점>도곡</거래점>";
xmlStr += 		"</data>";
xmlStr += 	"</body>";
xmlStr += "</root>";


Document doc = getStringToDOM(xmlStr);

Element el = doc.getDocumentElement();

String rootNodeName = el.getNodeName();
System.out.println("rootNodeName: " + rootNodeName);

String nodeName  = "";
String nodeValue = "";
Node headerNode = el.getElementsByTagName("header").item(0);
NodeList headerNodeChild = headerNode.getChildNodes();
for( int i=0; i<headerNodeChild.getLength(); i++ ){
	NodeList dataNodeList = headerNodeChild.item(i).getChildNodes();
	for( int j=0; j<dataNodeList.getLength(); j++ ){
		nodeName  = dataNodeList.item(j).getNodeName();
		nodeValue = dataNodeList.item(j).getFirstChild().getNodeValue();
		
		System.out.println("nodeName: " + nodeName + "=" + nodeValue);
	}
	System.out.println("");
}
	/**
	 * XML 문자열을 DOM(Document) 객체로 변환
	 * @param xmlStr	XML문자열
	 * @return
	 * @throws Exception
	 */
	private static Document getStringToDOM(String xmlStr) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		return builder.parse(new InputSource(new StringReader(xmlStr)));
	}
	
	/**
	 * DOM(Document) 객체를 XML 문자열로 변환
	 * @param xmlStr	XML문자열
	 * @return
	 * @throws Exception
	 */
	private static String getDOMToString(Document doc) throws Exception {
		TransformerFactory transfac = TransformerFactory.newInstance();
		Transformer trans = transfac.newTransformer();
		trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
		trans.setOutputProperty(OutputKeys.INDENT, "yes");
		
		StringWriter sw = new StringWriter();
		StreamResult result = new StreamResult(sw);
		DOMSource source = new DOMSource(doc);
		trans.transform(source, result);
		
		return sw.toString();
	}
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;



public class TestMain {

	public static void main(String[] args) throws Exception {
		List list = new ArrayList();
		Map map = new HashMap();
		map.put("a", "1");
		map.put("b", "2");
		map.put("c", 3d);
		BigDecimal  b = new BigDecimal(1.1);
		b.toString();
		map.put("3", b);
		list.add(map);
		
		String str = resultXMLString(list, "0000");
		System.out.println(str);
	}
	/**
	 * Map 객체의 List 배열을 바탕으로 XML을 만든다.
	 * 2008.11.11 ddakker 추가
	 * @param list	  : XML 의 list 하위 item을 생성할 데이터 
	 * @param errCode : result 노드에 들어갈 값 | 0: 성공, 기타 에러코드
	 * @return
	 */
	public static String resultXMLString(List list, String errCode){ 
		CDATASection cdata 		= null;
		Text 		 text 		= null;
		String 		 xmlString 	= null;
		
		try{
			
	 	DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();
	     DocumentBuilder docBuilder = dbfac.newDocumentBuilder();
	     Document doc = docBuilder.newDocument();
			
	     Element eRoot = doc.createElement("ROOR");
	     doc.appendChild(eRoot);
	     
	     Element eResult = doc.createElement("result");
	        eRoot.appendChild(eResult);
	        
	        text = doc.createTextNode(errCode);
	        eResult.appendChild(text);
	                 
	     Element eListCnt = doc.createElement("list_cnt");
	        eRoot.appendChild(eListCnt);
	        
	        text = doc.createTextNode(list.size()+"");
	        eListCnt.appendChild(text);
	     
	        Element eList = doc.createElement("list");
	        eRoot.appendChild(eList);
	        
	        int listCnt = list.size();
	        for( int i=0; i>listCnt; i++ ){
	        	Element eItem = doc.createElement("item");
	        	eList.appendChild(eItem);
	        	
	        	Map map = (Map)list.get(i);
	        	Set set = map.keySet();
	        	Iterator it = set.iterator();
	        	while( it.hasNext() ){
	        		String key   = (String)it.next();
	        		Object value = map.get(key);

	        		Element eKey = doc.createElement(key);
	        		eItem.appendChild(eKey);
	            	
	        		cdata = doc.createCDATASection(value==null?"":value.toString());               	
	            	eKey.appendChild(cdata);
	        	}
	        }

	        xmlString = getDOMToString(doc);
	     
		}catch(Exception e){
			System.out.println(e);
			xmlString = "error";// faultXMLString("1111", "XML생성에 실패 하였습니다.");
			
		}   	    	
		
		return xmlString;
	}
	
	/**
	 * XML 문자열을 DOM(Document) 객체로 변환
	 * @param xmlStr	XML문자열
	 * @return
	 * @throws Exception
	 */
	private static Document getStringToDOM(String xmlStr) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		return builder.parse(new InputSource(new StringReader(xmlStr)));
	}

	/**
	 * DOM(Document) 객체를 XML 문자열로 변환
	 * @param xmlStr	XML문자열
	 * @return
	 * @throws Exception
	 */
	private static String getDOMToString(Document doc) throws Exception {
		TransformerFactory transfac = TransformerFactory.newInstance();
		Transformer trans = transfac.newTransformer();
		trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
		trans.setOutputProperty(OutputKeys.INDENT, "yes");
		
		StringWriter sw = new StringWriter();
		StreamResult result = new StreamResult(sw);
		DOMSource source = new DOMSource(doc);
		trans.transform(source, result);
		
		return sw.toString();
	}


}
    

    /**
     * ResultSet를 List 로 생성
     * 2008.11.11 ddakker 추가
     * @param rs   ResultSet instance
     * @return
     */
    public static List getRsToList(ResultSet rs){
    	
    	List list = new ArrayList();
    	
    	try {
    		
    		if( rs.next() ){
    			do{
	    			Map map = new HashMap();
	    			
	    			ResultSetMetaData rsMD= rs.getMetaData();
	    			int rsMDCnt = rsMD.getColumnCount();
	    			for( int i = 1; i <= rsMDCnt; i++ ) {    				
	    				String column = rsMD.getColumnName(i).toLowerCase();
					    String value  = rs.getString(column);
					    				    
					    map.put(column, value);
				    }
	    			
	    			list.add(map);
    			}while( rs.next() );
    			
    		}else{
    			list = java.util.Collections.EMPTY_LIST;
    		}
			
			
		} catch (Exception e) {					
			list = null;
		}
    	
    	return list;
    }

+ Recent posts