spring boot 기본 이상 처리

3928 단어 springboot
이번 주 에 진 걸 이 가 쓴 사용자 정의 이상 한 위 챗 이상 을 볼 때 사용자 정의 이상 상태 코드 와 정 보 를 사용 합 니 다. 오류 가 발생 했 을 때 그 를 던 지고 @ ExceptionHandler 주석 으로 전역 이상 프로 세 서 를 정의 합 니 다. 이상 한 내용 에 따라 프론트 데스크 톱 에 상태 코드 와 정 보 를 보 내 고 이상 한 코드 를 다음 그림 과 같이 처리 합 니 다.
//         
    @ExceptionHandler(value = WechatLoginException.class)
    public String WechatLoginExceptionHandler(HttpServletRequest request, HttpServletResponse response, WechatLoginException e){
        logger.error("      :---Host {} invokes url {} ERROR: {}", request.getRemoteHost(), request.getRequestURL(), e.getMessage());
        response.setStatus(e.getCode());
        return e.getMessage();
    }

여기 서 제 가 봤 을 때 약간 의 심 스 러 웠 습 니 다. 상태 코드 를 응답 에 기 록 했 는데 정 보 는 바로 돌 아 왔 습 니 다. 진 걸 에 게 물 었 습 니 다. 프론트 데스크 에서 역시 e. getMessage () 의 정 보 를 받 지 못 했 습 니 다. 인터넷 에서 검색 해 보 았 습 니 다. response. senderror (code, message) 라 는 방법 으로 이상 한 정 보 를 되 돌려 주 는 것 을 추 천 했 습 니 다. 그런데 이렇게 시도 한 후에 이상 한 질문 을 받 았 습 니 다.
알 수 없 는 차단기
프로젝트 는 로그 인 여 부 를 검증 하 는 데 사용 되 는 차단 기 를 설정 하 였 습 니 다. 이것 이 전제 입 니 다. response. setStatus () 방법 을 사용 할 때 프론트 데스크 는 들 어 오 는 상태 코드 를 정확하게 받 아들 일 수 있 고 response. senderror () 를 사용 할 때 프론트 데스크 는 401 사용자 가 로그 인하 지 않 은 상태 코드 를 받 아들 여 정지점 에서 디 버 깅 을 합 니 다. 각각 차단기 에 있 습 니 다.이상 한 방법 을 뛰 어 내 려 이상 한 방법 을 처리 하 는 데 정지점 을 두 고 response. setStatus () 와 response. sendError () 방법 으로 실행 순 서 를 보 는 것 을 테스트 한 결과 놀 랐 습 니 다. response. setStatus () 를 사용 하여 실행 순 서 를 보 았 습 니 다.
response. sendError () 실행 순서 사용 하기:
놀 라 운 점 이 생 겼 습 니 다. 1. setStatus () 요청 시 차단기 2. senderror () 를 거치 지 않 고 이상 처리 가 끝 난 후 차단 기 를 통 해 등록 차단기 설정 을 확인 하여 첫 번 째 문 제 를 해결 하 였 습 니 다.
public void addInterceptors(InterceptorRegistry registry) {
        //      ,        
        registry.addInterceptor(authInterceptor)
        .excludePathPatterns("/user/login")
        .excludePathPatterns("/user/wechatLogin");
    }

이 이상 은 사용자 가 로그 인 할 때 던 진 것 입 니 다. 로그 인 할 때 로그 인 경 로 를 무시 합 니 다. 로그 인 하지 않 은 요청 을 차단 할 뿐 로그 인 을 요청 하 는 요청 을 차단 해 서 는 안 됩 니 다. 이것 은 정확 하지만 두 번 째 는 차단 요청 을 무시 해 야 합 니 다. 왜 senderror () 방법 을 바 꾼 후에 이상 처리 가 끝 난 후에 이상 차단 기 를 거 쳤 습 니까?
springboot 의 기본 이상 처리
두 가지 방법 을 비교 해 보면 setStatus () 는 상 태 를 바 꾸 었 을 뿐 입 니까? sendError () 는 요청 오류 의 의미 가 있 습 니 다. 그래서 요청 오류 가 발생 한 것 이 아 닌 지 추측 하고 방법 을 throw new Runtime Exception () 으로 직접 바 꿉 니 다.차단기 차단 요청 을 발견 한 url 은 / error 의 url 입 니 다. 이 / error 의 url 은 프로젝트 에서 어떠한 컨트롤 러 도 정의 하지 않 았 고 이러한 요청 도 하지 않 았 습 니 다. 인터넷 에 접속 하여 조회 하 였 습 니 다. 이것 은 Spring Boot 가 기본 맵 을 제공 하 였 습 니 다. / error 는 정리 에서 이상 을 던 진 후에 이 요청 으로 전 환 됩 니 다.또한 이 요청 은 이상 한 내용 을 보 여 주 는 전역 오류 페이지 가 있 습 니 다. 그러나 우리 의 차단 기 는 이 요청 을 차단 하 였 습 니 다. (또한 이 요청 은 정확 한 쿠키 를 가지 고 있 지 않 습 니 다) 그래서 401 오류 로 되 돌 아 왔 습 니 다. response 에 도 우리 가 정의 한 상태 코드 와 정보 가 없습니다.
json 아니면 html
모든 진실 이 밝 혀 졌 습 니 다. 그런데 갑자기 브 라 우 저 에서 요청 한 것 이 라면 서버 오류 후 springboot 의 기본 이상 처 리 는 html 로 되 돌아 가 는 것 이 라 고 생각 했 습 니 다. 그러나 우리 앞 배경 에서 분 리 된 요청 처럼 되 돌아 오 는 것 은 html 가 아니 라 json 의 오류 정보 입 니 다. 이것 은 어떻게 구분 해 야 합 니까?구 글 플러그 인 을 사용 하여 요청 을 보 냅 니 다. 돌아 오 는 body 는 다음 과 같 습 니 다.
브 라 우 저 로 요청 한 것 은 html 페이지 입 니 다.

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Sat Apr 13 21:34:34 CST 2019
There was an unexpected error (type=Internal Server Error, status=500).
No message available

두 요청 이 다른 지 자세히 살 펴 보고 브 라 우 저 요청 정보 requestheader 에서 Accept 필드 를 발 견 했 습 니 다.
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

요청 을 보 낼 때 spring - boot 는 Accept 필드 에 따라 응답 하 는 내용 을 되 돌려 줍 니 다. 예 를 들 어 application / json 은 json 으로 돌아 가 고 text / html 은 html 로 돌아 가 며 spring - boot 는 정말 주도면밀 하 다 는 것 을 깨 달 았 습 니 다.
총결산
spring - boot 는 호의 로 이상 을 묵인 해 주 었 지만 귀 찮 게 해 주 었 습 니 다. 자신 이 이해 하지 못 한 것 같 습 니 다. 학습 길이 아직 멀 었 습 니 다.

좋은 웹페이지 즐겨찾기