2016-08-30 2 views
4

response.getWriter에서 던져 IOException이()에 관해서는 소나 위반을 해결하는 방법 :응답을 구축하기 위해 다음 코드가 포함 나는 아주 간단한 서블릿을

@Override 
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 
    response.setContentType(CONTENT_TYPE); 
    final PrintWriter out = response.getWriter(); 
    // ... 

내 수중 음파 탐지기가 함께 중요한 문제를 제기 규칙 : "Exceptions should not be thrown from servlet methods". 소나는 이러한 예외가 던져 질 수 있도록 나쁜 생각 설명 : 서블릿에서 예외를 잡을 수

실패는 취약한 상태로 시스템을 떠날 수, 가능한 서비스 거부 공격의 결과로, 또는 노출 왜냐하면 서블릿이 예외를 던지면 서블릿 컨테이너는 일반적으로 디버깅 정보 을 다시 사용자에게 보냅니다. 그리고 그 정보는 침입자에게 매우 가치있을 수 있습니다.

그러나 예를 이해한다면 response.getWriter()에서 잠재적 인 IOException을 현명하게 관리하는 방법을 알 수 없습니다.

일부 사람들은이 진술이 예외를 제기 할 수있는 때를 설명하고, 우리 자신이 그것을 어떻게 관리해야하는지/왜 중요합니까?

편집 : 나는 조금 좌절했지만 첫 번째 대답을 수락했다. stacktrace와 가능한 다른 민감한 정보를 세계에 공개하는 기본 동작처럼 서블릿 컨테이너가이 예외를 관리하게하는 것은 나쁜 습관입니다. 필자의 경우 HTTP 엔드 포인트가 내부 모니터링에 사용되었습니다. 그래서 내 경우에는 (관련된) 정보를 공개하고 싶었고, 아무런 PrintWriter가 없다면 어떻게 할 수 있는가? ...

내 프로그램은 오류 로그를 출력하고 HTTP 오류를 반환한다. 내용이없는 코드. 나는 그것이 정말로 일어날 수 있는지 모른다. .. 그러나 Sonar와 나는 행복하다.

+1

1) catch하고 로그하여 클라이언트에 아무 것도 제공하지 않거나 2) 필터를 사용하여 요청 처리기에서 벗어난 예외를 catch 한 다음 사용자에게 합당한 것을 제시 할 수 있습니다 (예 : http : /stackoverflow.com/questions/11245932/how-to-handle-exceptions-thrown-while-rendering-a-view-in-spring-mvc). 또한 Sonar가 최악의 경고를 제공하지만 특정 시나리오에서 어떤 것이 적절한 지 판단 할 수는 없습니다. –

+0

@ JasonC 다른 답변에 대한 링크는 나에게 좋은 대답 인 반면, 이것이 SonarQube 경고에 대한 해결책이라는 사실을 계속 지킬 가치가 있다고 생각합니다. (면책 조항 : 나는 sonarqube 용 자바 분석기를 개발한다.) 그래서 나는 질문을 재개하고 중복으로 표시하지 않아야한다고 생각하는 이유이다). – benzonico

+0

@benzonico OP는 서블릿에서 던져진 예외를 관리하는 베스트 프랙티스를 분명히 요구합니다. 서블릿은 복제본과 동일하며 잘 응답됩니다. 일부 품질 경영 시스템 경고로 인해 OP가 방금 전에 그것에 대해 생각하기 시작했다는 사실은 부수적이며 매우 관련성이 없습니다. 그 질문이 어떻게 변했다고 생각합니까? –

답변

1

서블릿에 예외를 발생 시키면 stacktrace 및 기타 가능한 민감한 정보가 전세계에 표시됩니다. 예외를 잡아서 멋진 오류 메시지를 인쇄하거나 표시해야합니다.

+1

좋은 오류 메시지를 클라이언트에 보내야한다는 것을 알고 있습니다. 그러나 응답 객체에 쓸 수 없다면 어떻게 할 수 있습니까? 다시 말하지만 getWriter가 IOException을 throw 할 수있는 시점을 이해하지 못합니다. – mcoolive

+1

getWriter 호출을 try catch 블록으로 랩핑하고 catch 블록에서 예외가 발생할 경우 수행 할 작업을 결정할 수 있습니다. 예를 들어, 외부 요인으로 인해이 경우 getWriter가 예외를 throw하지 못하면 경고를 무시할 수 있습니다. –

-1

간단합니다. 귀하의 서비스가 가지고있는 모든 소비자가 멍청이이며 어린 이용 장갑으로 치료해야한다고 가정하십시오. 즉, 전체 예외 대신 원하는 형식으로 오류 메시지를 보내야합니다.

+0

코드에서 제안을 달성 할 수있는 방법을 설명 할 수 있다면이 답변을 향상시킬 수 있습니다. –

+1

그러나 response.getWritter()가 실패 할 때 어떻게 멋지게 형식화 된 오류 메시지를 보낼 수 있습니까? – mcoolive

관련 문제