기존코드와 변경한 코드
@PreAuthorize("isAuthenticated()")
@GetMapping("/article/modify/{id}")
public String articleModify(QuestionForm articleForm, @PathVariable("id") Integer id, Principal principal) {
Question article = this.questionService.getQuestion(id);
if (!article.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}
articleForm.setSubject(article.getSubject());
articleForm.setContent(article.getContent());
return "question_form";
}
기존의 게시글 수정 코드이다.
기존 게시글의 작성자회원정보와 접속자의 정보가 다를 경우 'ResponseStatusException' 을 통해 400에러가 나타나며 에러안에 해당 에러메세지가 없다는 문구가 나타났다.
400에러 대신 에러템플릿으로 새창을 띄워 에러메세지를 표현하기 위해 아래와 같이 코드를 수정하였다.
@PreAuthorize("isAuthenticated()")
@GetMapping("/article/modify/{id}")
public ModelAndView articleModify(QuestionForm articleForm, @PathVariable("id") Integer id, Principal principal) {
Question article = this.questionService.getQuestion(id);
if (!article.getAuthor().getUsername().equals(principal.getName())) {
ModelMap model = new ModelMap();
model.addAttribute("errorMessage", "수정권한이 없습니다.");
return new ModelAndView("error_page", model);
}
articleForm.setSubject(article.getSubject());
articleForm.setContent(article.getContent());
return new ModelAndView("question_form", "questionForm", articleForm);
}
보여줄 에러템플릿에 에러메세지를 모델값으로 저장 후 템플릿을 불러오기 위해서 메서드를 String 값 리턴이 아닌 ModelAndView 값을 리턴 하도록 수정하였다.
또한 해당 작성자와 접속자 정보가 다를경우 'ResponseStatusException' 로 400에러를 띄우는 것이 아닌 에러메시지를 모델로 저장한 템플릿으로 불러오기 위해 위와같이 수정하였다.
반환값이 ModelAndView 임으로 맨아래에도 ModelAndView 값으로 작성폼을 리턴하도록 수정을 해주었다.
Model 과 ModelAndView 의 차이
ModelAndView 는 Model 과 View 를 동시에 반환할 수 있다.
작성한 에러 템플릿
해당 템플릿으로 저장한 오류메시지가 정상적으로 표기된다.
오류창이 뜰경우 이전페이지로 돌아가기 위해 a태그를 사용하여 이전페이지로 돌아갈 수 있도록
버튼을 만들었다.
a태그를 사용하여 이전페이지로 돌아가는 방법
<a href="javascript:history.go(-1)">이전 페이지로 돌아가기</a>
href 에 스크립트 히스토리-1 를 사용하여 바로 전 페이지로 돌아갈 수 있다.