2009-06-29 7 views
4

HTTP 응답 코드를 검사하기 위해 서블릿 필터를 작성할 수 있습니까?HTTP 응답 코드를 검사하기 위해 서블릿 필터를 작성할 수 있습니까?

나가는 HTTP 응답 코드를 비파괴 적으로 검사 할 필터를 작성하고 싶습니다. 그러나 Response 객체에는 getResponseCode() 같은 메소드가없는 것 같습니다.

서블릿에서 처리되지 않은 예외가 처리되어야하는 방법 또한 내게 명확하지 않습니다. 정말이 필터가 실제로 아무것도 설정하지 않기를 바랄뿐입니다. 수동적이다.

아이디어가 있으십니까?

(내 다른 접근 방식은 사용자 정의 톰캣 밸브를 기록하는 것이며,하지만 너무 이식 할 수 없습니다.)

+0

입니다,하지만 _ "이 질문은 전에 물어되었습니다 이미 답변이 있습니다. "_ 다른 질문은 두 달 후 나온 것입니다. 중복이 아닌가요? –

답변

7

당신은 HttpServletResponseWrapper를 사용하여 보내는 응답을 래핑 할 수 방법은 먼저 질문을이

public class GetStatusResponseFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, 
         ServletResponse response, 
         FilterChain filterChain) 
          throws IOException, ServletException { 
     GetStatusWrapper wrapper; 
     wrapper = new GetStatusWrapper((HttpServletResponse) response); 
     filterChain.doFilter(request, wrapper); 
     System.out.println("status = " + wrapper.getStatus()); 
    } 

    @Override 
    public void init(FilterConfig arg0) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 
} 
+0

OK, 세 가지 문제 : 나는 이것을 구현하는 것을 보았다. 하나는 상태를 설정하는 다른 방법이 있지만, 나는 그것들을 가지고있다.) 상태가 explicate으로 설정되지 않은 경우 (내 테스트 에서처럼) 200 OK라고 안전하게 가정 할 수 있습니까? THREE) 예를 들어 super.sendRedirect()가 오류를 throw하면 어떻게됩니까? 나는이 방법이 지나치게 길어지기 시작했으며 권위있는 SC를 100 % 포착 할 것이라는 확신을 갖지 못했습니다. –

+0

1) 이것은 "작동하는지 확인하십시오"구현 일뿐입니다. 2) 절대적으로 3) 이것은 실제 문제입니다. 4) IMHO 다른 휴대용 접근법은 없습니다. – dfa

+0

OK를 오버라이드해야하는 몇 가지 방법 만 있습니다. 제작 중이며 작동하는 것처럼 보입니다. 감사. 마지막으로 int 상태를 200으로 초기화하고 내부 try/catch 블록을 사용하여 다양한 setStatus, sendError 및 sendRedirect 메서드를 재정의합니다. –

0

가 원래 응답 클래스 주위에 프록시 래퍼를 작성하는 고려겠습니까? 이 방법으로 객체에 대한 이벤트/메소드 호출을 처리 할 수 ​​있습니다. 필터에서 다음

class GetStatusWrapper extends HttpServletResponseWrapper { 

    private int status; 

    GetStatusWrapper(HttpServletResponse response) { 
     super(response); 
    } 

    @Override 
    public void setStatus(int sc) { 
     super.setStatus(sc); 
     status = sc; 
    } 

    public int getStatus() { 
     return status; 
    } 
} 

:

+0

예, 세부 정보가 흐릿합니다. 이 경우 처리되지 않은 예외는 어떻게 처리됩니까? 내 프록시 래퍼가 호출 스택을 다시 통과 할 수 있습니까? 여기서 상태 코드를 변경할 수 있습니까? (이게 가능할 지 모르겠다.) –

관련 문제