IT/development

[spring Boot] Request method 'POST' not supported(feat. thymeleaf)

알 수 없는 사용자 2022. 11. 22. 06:06
반응형

목차

     

    미래의 내가 보기 위해 기록함

    사이드 프로젝트에서 html template으로 thymeleaf 사용 하고 있다.

    보통 이 에러는 클라이언트와 서버의 http method가 일치하지 않는 경우 발생하는데

    내 경우는 아래처럼 form에서도 post로 보내고 서버에서도 post로 받게끔 되어 있었다.

     

    view

    <form role="form" action="/admin/board/new" th:object="${boardForm}" method="post">
            <div class="form-group">
                <label th:for="name">제목</label>
                <input type="text" th:field="*{title}" class="form-control" placeholder="제목을 입력하세요"
                       th:class="${#fields.hasErrors('name')}? 'form-control fieldError' : 'form-control'">
                <p th:if="${#fields.hasErrors('title')}" th:errors="*{title}">Incorrect date</p>
            </div>
    
            <div class="form-group">
                <label th:for="content">내용</label>
                <input type="text" th:field="*{content}" class="form-control" placeholder="내용을 입력하세요"
                       th:class="${#fields.hasErrors('content')}? 'form-control fieldError' : 'form-control'">
                <p th:if="${#fields.hasErrors('content')}" th:errors="*{content}">Incorrect date</p>
            </div>
    
            <div class="form-group">
                <label th:for="name">이름</label>
                <input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요"
                       th:class="${#fields.hasErrors('name')}? 'form-control fieldError' : 'form-control'">
                <p th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Incorrect date</p>
            </div>
    
            <button type="submit" class="btn btn-primary">Submit</button>
        </form>

    Controller

        /**
         * 게시글 작성 폼 
         * @param model
         * @return
         */
        @GetMapping("/admin/board/new")
        public String createForm(Model model) {
            model.addAttribute("boardForm", new BoardVO());
            return "board/createBoard";
        }
    
        /**
         * 게시글 작성 처리 
         * @param boardVO
         * @return
         */
        @PostMapping("/admin/board/new")
        public String create(BoardVO boardVO) {
            boardService.insertBoard(boardVO);
            return "redirect:/admin/board/list";
        }

     

    음..아무 문제가 없는데? 😥

    곰곰히 생각해 본 결과 현재 spring security가 적용되어 있었고 이 경우 POST로 보낼 때 csrf 토큰값을 같이 보내야 된다는 걸 깜박 했다.

     

    이 경우 해결 방법이 3가지가 있다.

    spring securiry 설정 변경

    위험하긴 한데 spring security에서 csrf 토큰 사용 안함으로 아래처럼 변경


    form submit 시 csrf 토큰 같이 전송


    thymeleaf일 경우 th:action  사용

    thymeleaf의 th:action을 사용할 경우 csrf token 전송하는 부분이 포함되어 있다고 함

     

    3가지 중 택 1해서 수정하면 정상적으로 요청되어 처리가 된다.

     

    Request method 'POST' not supported 이 에러 메시지의 경우 원인이 다양하므로 

    먼저 가장 기본적인 원인인 클라이언트와 서버의 http method가 일치하는지부터 확인 후 다음 스텝을 밟아서 에러를 찾자.

    반응형