코린이의 기록

[JSP] setRequestHeader 에서 csrfHeader is not defined 오류 발생 본문

javascript,HTML,CSS

[JSP] setRequestHeader 에서 csrfHeader is not defined 오류 발생

코린이예요 2018. 7. 10. 16:57
반응형

아래와 같은 csrfHeader is not defined 발생함.

 Uncaught ReferenceError: csrfHeader is not defined

    at Object.beforeSend (full:841)

    at Function.ajax (jquery.js:7933)

    at HTMLSpanElement.<anonymous> (full:833)

    at HTMLSpanElement.dispatch (jquery.js:3063)

    at HTMLSpanElement.eventHandle (jquery.js:2681)


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
$.ajax({
    url : "${ctx}/overview/save_location_full",
    type : "POST",
    contentType : "application/json; charset=utf-8",
    cache : false,
    dataType : "json",
    data : JSON.stringify(machineLocations),
    beforeSend : function(xhr) {
        xhr.setRequestHeader(csrfHeader, csrfToken);
    },
    success : function(data) {
        if (data != null) {
            if (data.status == "success") {
                alert("Succeed Save Location.");
            } else {
                alert("Fail !!");
            }
        } else {
            alert("No Data Received !!");
        }
    },
    error : function(xhr, status, error) {
        alert("xhr:" + xhr + ", status:" + status
                + ", error:" + error);
    }
});
cs

▲ full.jsp


원인

decorators tag를 사용하여 layout을 공통적으로 부여하고 있는데 위 jsp파일이 exclude 되어 csrfHeader와 Token을 찾아오지 못함.

아래 decorators.xml을 보면 excludes tag로  <pattern>/overview/full</pattern> 가 설정되어 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="euc-kr"?>
 
 
<decorators defaultdir="/WEB-INF/jsp/common/layout">
    <excludes>
       //생략
        <pattern>/overview/full</pattern>
       // 생략
        <pattern>/index.jsp</pattern>
        <pattern>/index.html</pattern>
        <pattern>*.js</pattern>
        <pattern>*.css</pattern>
    </excludes>
 
    <decorator name="default" page="default.jsp">
        <pattern>/*</pattern>
    </decorator>
</decorators>
cs

▲ decorators.xml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ include file="/WEB-INF/jsp/common/include/taglibs.jsp"%>
<%@ page import="org.springframework.security.core.context.SecurityContextHolder" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<sec:csrfMetaTags />
 
 
<script type="text/javascript">
 
    var csrfParameter = $("meta[name='_csrf_parameter']").attr("content");
    var csrfHeader = $("meta[name='_csrf_header']").attr("content");
    var csrfToken = $("meta[name='_csrf']").attr("content");
 
    // 생략
 
</body>
</html>
 
cs

▲default.jsp



해결 방법

<head> tag안에 아래 <meta> data를 추가한 후
1
2
<meta id="_csrf" name="_csrf" content="${_csrf.token}" />
<meta id="_csrf_header" name="_csrf_header" content="${_csrf.headerName}" />
cs


ajax 호출하는 function 내부에 아래 csrfToken과 csrfHeader를 정의해준다.

1
2
var csrfToken = $("meta[name='_csrf']").attr("content");
var csrfHeader = $("meta[name='_csrf_header']").attr("content");
cs

▲ full.jsp



반응형
Comments