예를들어... 시스템 구성이 아래와 같이 되어있다고 가정을 할때. ---------------------------------------------------- 어플리케이션(결재) 서버 : app.company.com 메일서버 : mail.company.com ----------------------------------------------------
시스템에서의 처리는 당연 결재서버 또는 메일서버를 Primary Server로 구성하고 나머지 서버는 Secondary Server로 구성하여 프로그램상으로 개발하는데는 문제점이 없도록 하고 있습니다. 하지만 웹브라우저상에서 처리되어야 하는 코드중에 이런것이 있습니다.
1) 결재 처리요청 메일 발송 2) 결재자 결재요청 메일 수신 3) 결재할 문서 목록에서 문서를 클릭 (app.company.com) 4) 승인버튼 클릭하여 결재처리 (app.company.com) 5) 결재자에게 발송된 결재요청메일 삭제 (mail.company.com) 6) 결재할 문서 목록 갱신 (app.company.com)
위와같은 순서로 처리되는 경우, 5) -> 6) 항목으로 넘어가는 과정에서 웹브라우저상 권한없음 오류가 발생할 수 있습니다. 이는 DB ACL 문제가 아니며 브라우저상 도메인이 다른 페이지에 대한 자바스크립트 접근권한이 없다는 경고입니다.
물론 5)번 항목 처리시 새창을 오픈해서 처리하고 닫아버리면 될수도 있는 문제겠지만, 창이 열리고 닫히고 그러면 싫어할 사람들이 많죠. 아니면 document.domain = "company.com"; 코드를 화면에 보여지는 모든 페이지에 추가하면 되는 문제일 수도 있습니다. 하지만 연동되는 타시스템이 있다면 이걸 맞춰주는것도 쉬운 문제는 아닐듯 합니다.
다른 방법에 대해서 설명을 하겠습니다. 5) 번 항목에서 결재 요청메일을 삭제하고 나서는 화면이 어떻게 되어야할지 보통적으로 에이전트에서 자바스크립트 형식으로 프린트를 합니다.
print |<script> try { opener.window.location.reload(); window.close(); } catch( e ) { var actionURL = "http://app.company.com/refresh.nsf/Refresh?CreateDocument"; var _form = document.createElement("form"); _form.action = actionURL; _form.method = "post"; // saveoptions 필드를 0으로 두어야 필요없는 문서가 DB에 저장되지 않습니다. var _saveoption = document.createElement( "<input type=hidden name='saveoptions'>" ); _form.appendChild(_saveoption); document.body.appendChild(_form); _form.saveoptions.value = "0"; _form.submit(); } </script>|
마지막에 처리될 코드이죠...
그럼 이것으로 끝나냐? 아니죠? 위의 코드에 보면 var actionURL = "http://app.company.com/refresh.nsf/Refresh?CreateDocument"; 이라는 코드가 있습니다. 이는 refresh.nsf 라는 DB가 있어야 하며 그 DB에는 Refresh라는 양식이 있어야 합니다. 또한 var _saveoption = document.createElement( "<input type=hidden name='saveoptions'>" ); 이라는 부분이 있는데 이는 Refresh 양식에 saveoptions 필드가 있어야 존재해야 한다는 얘기가 됩니다.
그리고 또 중요한건... Refresh 양식에 $$Return 필드를 두어 필요한 코드가 들어갈 수 있도록 합니다. 예를들어 "<script>opener.window.location.reload();window.close();</script>"라고 두면 상위 opener를 reload하고 창이 닫힙니다.
------------------------------------- 위와 같이 처리하는 이유는... CreateDocument는 URL 호출이기 때문에 도메인과 상관없이 호출할 수 있으며, createdocument로 호출된 이후에는 opener와 같은 도메인인 app.company.com으로 변경되므로 opener를 자바스크립트로 접근하여 처리할 수 있게 됩니다.
function NumberOnly() { var input_key = event.keyCode; if (!(IsNumber( input_key ))) { event.keyCode = '0'; return false; } } function IsNumber( inputValue ) { if (inputValue >= '48' && inputValue <= '57') return true; else return false; } function _Currency(num) { if(num == "" || num == 0) { return num; } var dotPos = (num+"").split("."); var dotU = dotPos[0]; var dotD = dotPos[1]; if (Number(dotU) < 0) { dotU = (Number(dotU) * -1) + ""; var minus = true } else { var minus = false } var commaFlag = dotU.length%3 if(commaFlag) { var out = dotU.substring(0, commaFlag) if (dotU.length > 3) { out += ","; } } else { var out = ""; } for (var i=commaFlag; i < dotU.length; i+=3) { out += dotU.substring(i, i+3);
if( i < dotU.length-3) { out += ","; } }
if(minus) { out = "-" + out; }
if(dotD) { out += "." + dotD ; }
return out; } function _Reverse(str) { if(str == null) return null; var s = str; var r = ''; for(i=str.length; i>0; i--) r += s.charAt(i-1); return r; } function _CurrencyClear(s) { var cntArray = new Array(); for( var i = 0 ; i < s.length ; i++) { cntArray[i] = s.indexOf(","); s = s.replace(",",""); } return s; } function setCurrency(objName) { var input = document.getElementById(objName); if ( input.value.length == 0 ) { return; } var amt = 0; if(input.value.length != 0 ) { amt = fillZero(input.value, input.format); } input.value = _Currency(amt); } function focusCurrency(objName) { var input = document.getElementById(objName); if ( input.value.length == 0 ) { return; } input.value = Number(_CurrencyClear(input.value)); input.select(); } function fillZero(input, type) { //input이 숫자타입으로 넘어올 때 //에러가 남. 그래서 스트링 타입으로 변환해야 함 if ( !type ) { return input+""; } var format = type.split('.'); var value = (input+"").split('.');
if ( Number(format[1]) == 0 ) { return input+""; } if (!value[1]) { value[1] = ""; }
//소수점 이하가 포맷보다 클 경우는 //그냥 반올림하여 리턴한다 if (value[1].length > Number(format[1])) { return (Number(input).toFixed(Number(format[1]))); } //소수점 자리수에 맞게 '0'을 채워준다 //예를 들면 데이타 형식이 5.2일 경우 //입력값이 '50'이면 '50.00'으로 리턴한다 while ( value[1].length < Number(format[1]) ) { value[1] += "0"; }
//value[0]을 Number 객체로 변환 //000.000 같은 경우를 0.000으로 변환하기 위해서 return (Number(value[0]) + "." + value[1]); }
<script language="javascript"> function isEmail(str) { // regular expression 지원 여부 점검 var supported = 0; if (window.RegExp) { var tempStr = "a"; var tempReg = new RegExp(tempStr); if (tempReg.test(tempStr)) supported = 1; } if (!supported) return (str.indexOf(".") > 2) && (str.indexOf("@") > 0); var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)"); var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$"); return (!r1.test(str) && r2.test(str)); } </script>
댓글을 달아 주세요