1// ========================================================== 2// [ì ì CSRF í í° íì¸ ë¡ì§ - v3] 3// IE 모ë ëì: íì´ì§ ë¡ë ìì ì 미리 주ì + submit ìì ì´ì¤ ë°©ì´ 4// ========================================================== 5 6(function() { 7 8 function getCsrfToken() { 9 var metaToken = document.querySelector("meta[name='_csrf']"); 10 return metaToken ? metaToken.getAttribute("content") : ''; 11 } 12 13 // POST í¼ì csrfToken hidden input 주ì (multipart í¬í¨ 모ë hidden input ë°©ì ì¬ì©) 14 // - multipart/form-dataë Spring CommonsMultipartResolverìì getParameter()ë¡ ì½í 15 function injectCsrfToken(formElem) { 16 var tokenValue = getCsrfToken(); 17 if (!tokenValue) return; 18 19 var method = formElem.getAttribute('method'); 20 if (!method || method.toUpperCase() !== 'POST') return; 21 22 if (!formElem.querySelector('input[name="csrfToken"]')) { 23 var hiddenInp = document.createElement("input"); 24 hiddenInp.setAttribute("type", "hidden"); 25 hiddenInp.setAttribute("name", "csrfToken"); 26 hiddenInp.setAttribute("value", tokenValue); 27 formElem.appendChild(hiddenInp); 28 } 29 } 30 31 // [1ë² ë°©ì´ë§] íì´ì§ ë¡ë ìë£ ì¦ì íì¬ DOMì 모ë POST í¼ì í í° ì£¼ì 32 // IE 모ëìì form.submit() ì§ì í¸ì¶ ì submit ì´ë²¤í¸ê° ë°ìíì§ ìì¼ë¯ë¡ 33 // submit ìì ì´ ìë ë¡ë ìì ì 미리 주ì íë ê²ì´ íµì¬ 34 function injectAll() { 35 var forms = document.getElementsByTagName('form'); 36 for (var i = 0; i < forms.length; i++) { 37 injectCsrfToken(forms[i]); 38 } 39 } 40 41 if (document.readyState === 'loading') { 42 document.addEventListener("DOMContentLoaded", injectAll); 43 } else { 44 injectAll(); 45 } 46 47 // [2ë² ë°©ì´ë§] submit ì´ë²¤í¸ ìº¡ì² (ë²í¼ í´ë¦ ë± ì¼ë° ì ì¶ ëë¹) 48 document.addEventListener("DOMContentLoaded", function() { 49 50 var csrfToken = getCsrfToken(); 51 var csrfHeaderMeta = document.querySelector("meta[name='_csrf_header']"); 52 var csrfHeader = csrfHeaderMeta ? csrfHeaderMeta.getAttribute("content") : ''; 53 54 document.addEventListener('submit', function(e) { 55 if (e.target && e.target.tagName === 'FORM') { 56 injectCsrfToken(e.target); 57 } 58 }, true); 59 60 // [3ë² ë°©ì´ë§] AJAX í¸ì¶ ê°ì§ (jQuery) 61 if (typeof jQuery !== 'undefined') { 62 $(document).ajaxSend(function(e, xhr, options) { 63 if (csrfHeader && csrfToken) { 64 xhr.setRequestHeader(csrfHeader, csrfToken); 65 } 66 }); 67 } 68 }); 69 70 // [4ë² ë°©ì´ë§] prototype ì¤ë²ë¼ì´ë© (IE ì¸ ë¸ë¼ì°ì ìì JSë¡ form.submit() í¸ì¶ ì ë³´ì¡°) 71 try { 72 var originalSubmit = HTMLFormElement.prototype.submit; 73 HTMLFormElement.prototype.submit = function() { 74 injectCsrfToken(this); 75 originalSubmit.apply(this, arguments); 76 }; 77 } catch(e) {} 78 79})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.