2011-04-26 7 views
3

캐싱을위한 서블릿 필터를 만들고 있습니다. 아이디어는 memcached에 응답 본문을 캐시하는 것입니다. 응답 본체에 의해 생성되는 (결과는 문자열입니다) :캐싱을위한 서블릿 필터

response.getWriter().print(result); 

내 질문은 응답 본문이 수정없이 memcached를 투입되기 때문에, 나는 여전히이 HttpServletResponseWrapper 사용자 생성해야 할 점이다? 누구든지이 필터에 대한 골격 코드를 제공 할 수 있습니까?

답변

2

필터에서 서블릿의 출력을 캡처 할 수 있어야합니다.

이렇게하려면 사용자가 HttpServletResponseWrapper를 삽입하여 getWriter().print()에 보낸 모든 출력을 수집해야 memcached에 전달할 수 있습니다.

아마의 라인을 따라 뭔가 :

ByteArrayOutputStream baos = new ByteArrayOutputStream(3000); 
    final PrintWriter w = new PrintWriter(new OutputStreamWriter(baos, "UTF-8")); 

    HttpServletResponse wrapper = new HttpServletResponseWrapper(response) { 

         @Override 
         public PrintWriter getWriter() throws IOException { 
          return w; 
         } 

        }; 

이 더 큰 프로젝트이며 네트워크 인프라를보다 효율적으로 제어 할 수 있다면, 또한 자바에서이 작업을 수행 할 수있는 좋은 생각하지만, 단지 수 서블릿 컨테이너 앞에 별도의 프록시 서버를 사용하십시오. 일반적인 캐시 제어 헤더 (서블릿이 아직 수행하지 않은 경우 필터를 사용하여 설정할 수 있음)에 의해 캐시되어야하는 것을 제어 할 수 있습니다.

+0

응답 본문을 수정하지 않아도 HttpServletResponseWrapper가 필수라는 것을 의미합니까? – dolphincody

+0

서블릿의 출력물을 얻으려면 어떻게해야합니까? 아무 것도하지 않으면 브라우저에 대한 네트워크 연결에 직접 씁니다. 그러면 필터에 아무 것도 표시되지 않습니다. – Thilo

+0

감사합니다. 이제 어떻게 응답 본문을 래퍼에서 가져 옵니까? – dolphincody

관련 문제