SpringBoot 전역 이상 처리 및 404 페이지 맞 춤 형 방법

1.오류 처리 원리 분석
SpringBoot 를 사용 하여 만 든 웹 프로젝트 에서 요청 한 페이지 가 존재 하지 않 거나(http 상태 코드 404)이상(http 상태 코드 보통 500)이 발생 하면 SpringBoot 는 오류 정 보 를 되 돌려 줍 니 다.
즉,SpringBoot 의 웹 프로젝트 에 서 는 오류 정 보 를 되 돌려 주 는/error 의 오류 인 터 페 이 스 를 자동 으로 만 듭 니 다.그러나 서로 다른 방문 방식 에 대해 다음 과 같은 두 가지 서로 다른 반환 정보 가 있 을 것 이다.이것 은 주로 당신 이 방문 할 때의 http 머리 정보Accept에 달 려 있 습 니 다.이 값 은 당신 이 받 을 수 있 는 유형 이 어떤 것 인지 지정 합 니 다.
브 라 우 저 를 사용 하여 접근 할 때의 헤더 정보 및 반환 결과
Accept: text/html

다른 장 치 를 사용 합 니 다.예 를 들 어 핸드폰 클 라 이언 트 등 이 방문 할 때 머리 정보 와 그 반환 결과(보통 앞 뒤 가 분 리 된 구조 에서)Accept: */*
2.오류 처리
처리 이상 은 주로 두 가지 방식 이 있 습 니 다.
1.SpringBoot 의 자동 설정 원 리 를 사용 하여 이상 처리
SpringBoot 는 이상 처 리 를 위 한 클래스ErrorMvcAutoConfiguration를 자동 으로 설정 합 니 다.관심 있 는 것 은 보 셔 도 됩 니 다.그리고 이 클래스 에서 잘못된 Basic ErrorController 클래스 를 정의 합 니 다.주요 코드 는 다음 과 같 습 니 다.

@Controller
@RequestMapping({"${server.error.path:${error.path:/error}}"})
public class BasicErrorController extends AbstractErrorController {

 	/**
 	 *         
 	 */
 @RequestMapping(produces = {"text/html"})
 public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
 HttpStatus status = this.getStatus(request);
 Map<String, Object> model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
 response.setStatus(status.value());
 	//     modelAndView  
 ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
 return modelAndView != null ? modelAndView : new ModelAndView("error", model);
 }
		
 /**
 *    json  
 */
 @RequestMapping
 public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
 HttpStatus status = this.getStatus(request);
 if (status == HttpStatus.NO_CONTENT) {
  return new ResponseEntity(status);
 } else {
  Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
  return new ResponseEntity(body, status);
 }
 }
많은 코드 는 깊이 연구 하지 않 으 니 관심 있 는 것 은 가서 볼 수 있다.위의 코드 는 서로 다른 요청 방식 에 대해 서로 다른 결 과 를 되 돌려 주 는 것 이다.그 관건 은 @RequestMapping주해 의produces = {"text/html"}속성 에 있다.
1)404,500 등 오류 페이지 를 되 돌려 줍 니 다.
템 플 릿 엔진 이 있 는 경우(페이지 렌 더 링 에 사용 가능)
프로젝트 에 사 용 된 템 플 릿 엔진,예 를 들 어 thymeleaf,freemarker 등 이 페이지 로 렌 더 링 할 때.templates 에서/error 폴 더 를 만 들 고 잘못된 상태 코드 에 대응 하 는.html 파일 을 추가 합 니 다.다음 그림:

여기 서 404 와 500 은 정확 한 오류 상태 코드 이 고 4xx 는 400,401 등 다른 4 개의 시작 오 류 를 나타 낸다.물론 모든 상태 코드 에 대응 하 는 오류 페이지 를 설정 할 수 있 지만 이렇게 하면 좋 을 것 이 없 기 때문에 4xx.html 와 같은 범 지 를 직접 사용 하여 대체 합 니 다.
저희 오류 페이지 에서 다음 과 같은 정 보 를 얻 을 수 있 습 니 다(바로 Model AndView 대상 의 내용 입 니 다).
필드 이름
설명 하 다.
timstamp
타임 스탬프
status
오류 상태 코드
error
오류 알림
exception
이상 개체
message
이상 한 소식
path
페이지 경로
세심 한 동료 들 은 이것 이 사실 휴대 전화 로 요청 할 때 돌아 오 는 제 이 슨 의 내용 이라는 것 을 알 게 될 것 이다.
예 를 들 어 코드 에 상단 정 보 를 추가 한 다음 백 엔 드 에 오류 코드 를 작성 합 니 다.

@RequestMapping("haserror")
@ResponseBody
public Object myError(){
 int i =10/0;
 return "something is error";
}
        :
<ul>
 <li>     :[[${status}]]</li>
 <li>    :[[${error}]]</li>
 <li>    :[[${exception}]]</li>
 <li>    :[[${message}]]</li>
 <li>    :[[${timestamp}]]</li>
</ul>

템 플 릿 엔진 이 없 는 경우
프로젝트 에 템 플 릿 엔진 을 사용 하지 않 았 을 때 전체 error 폴 더 를 static 폴 더 아래로 옮 기 면 됩 니 다.
그러나 이 때 는 위의 정 보 를 얻 을 수 없습니다.이것 은 정적 자원 이기 때문에 템 플 릿 엔진 이 렌 더 링 을 하지 않 습 니 다.
2)、대응 하 는 json 문자열 되 돌리 기
이것 은 결코 할 말 이 없다.돌아 오 는 것 은 제 이 슨 문자열 이다.형식 은 다음 과 같 습 니 다.

{
"timestamp": "2020-04-22T16:13:37.506+0000",
"status": 500,
"error": "Internal Server Error",
"message": "/ by zero",
"path": "/hello/haserror",
"reason": "  ,               "
}
3)사용자 정의 페이지 반환 정보
이것 이 야 말로 가장 중요 한 내용 이다.왜냐하면 이 정 보 는 제 이 슨 으로 돌아 갈 뿐만 아니 라 위의 오류 페이지 에서 도 얻 을 수 있 고 제 이 슨 으로 돌아 갈 수 있 기 때문이다.사실 아주 간단 합 니 다.바로 Spring 용기 에 하나의ErrorAttributes대상 을 추가 하면 됩 니 다.여기 서 저 는 그것 을 계승 하 는 키 종 류 를 선택 하 겠 습 니 다.

@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
 @Override
 public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
 //       ,            ,      ,       
 Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);

 //        
 errorAttributes.put("reason","  ,               ");
 //              webRequest    ,            

 return errorAttributes;
 }
}
이 사용자 정의 속성 이 사용 가능 한 지 두 가지 요청 방식 으로 각각 테스트 합 니 다.

2.AOP 의 이상 알림 으로 처리(추천)
그것 의 원 리 는 전체적인 이상 통 지 를 받 은 후에 처리 하 는 것 이다.저 희 는 프로젝트 에 다음 코드 만 쓰 면 됩 니 다.

@ControllerAdvice
public class ErrroAcvice {

 /**
 *           
 * @param request     ,   
 * @param response     ,   
 * @param e    (                 )
 */
 @ExceptionHandler(Exception.class) //            
 public void errorHandler(HttpServletRequest request, HttpServletResponse response,Exception e){
 	/*
 	 * You can do everything you want to do
  *       request response  ,           
  *   :
  *	1. request       Accept                         
  *	2.           ,  response                   
  * 3.           
 	 */
 
 String accept = request.getHeader("Accept");
				//                 	
 
 try {
  response.setStatus(500);
  response.getWriter().write("hello");
 } catch (IOException ex) {
  ex.printStackTrace();
 }
 
 }
}
3.두 가지 방법 비교:첫 번 째 방법 은 현재 프로젝트 에 잘못된 상태 코드 를 설치 한 페이지 를 SpringBoot 에서 찾 도록 하 는 것 입 니 다.사용자 정의 로 되 돌아 오 는 오류 정 보 를 지원 하 는 두 번 째 방법 은 AOP 의 사상 을 직접 사용 하여 이상 알림 처 리 를 하 는 것 으로 자유 성 이 크다.저 는 개인 적 으로 두 번 째 방법 을 사용 할 것 을 건의 합 니 다.자유도 가 높 기 때문에 자신의 업무 논리 에 따라 수시로 바 꿀 수 있 고 큰 용도 도 있 습 니 다.다음 글 은 두 번 째 방식 을 사용 한 후 첫 번 째 방식 으로 설 치 된 오류 페이지 와 사용자 정의 오류 정 보 를 모두 무효 화 하 는 좋 은 예 가 있 을 것 입 니 다.
스프링 부 트 전역 이상 처리 와 404 페이지 를 맞 춤 형 으로 만 드 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.스프링 부 트 전역 이상 처리 내용 에 대해 서 는 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기