2011-10-30 3 views
0

몇개의 html 페이지를 반환하는 작은 서블릿이 있습니다. 이 페이지 중 하나의 내용은 꽤 복잡하지만 매 시간마다 변경됩니다. 그러나 사용자가 자주 요청합니다. 각 요청마다 다시 계산하는 것을 피하고 싶습니다.캐시 된 gzip으로 압축 된 html 페이지를 http 서블릿 요청으로 되 돌리는 방법은 무엇입니까?

gzip-ed 버전을 메모리 (바이트 배열)로 준비 할 수 있는지 궁금해서이 페이지에 대한 모든 HTML 요청에 대한 응답으로 설정했습니다. 매시간 캐시 된 새 gzip-ed 버전을 다시 계산할 것입니다.

가능하다면 어떻게해야합니까? 필터를 사용해야합니까? 이 질문을 위해 모든 브라우저가 gzip-ed 응답을 처리 할 수 ​​있다고 가정 할 수 있습니다. 코드 예제를 찾고 있습니다.

답변

3

,이 해결책이 될 것 같다?

열기 Tomcat의 /conf/server.xml, 당신의 HTTP 포트의 <Connector>를 조회하고 새로운 속성을 추가하기 위해 다음과 같이 편집 :

<Connector ... compression="on"> 

톰캣 것이다 다음 GZIP 클라이언트가 지원 자동적 때 compressableMimeType 일치하는 모든 응답. 다른 모든 존경받는 웹 서버는 비슷한 구성 설정을가집니다.

0

귀하의 질문에 분명하지 않지만 데이터를 캐시하는 방법보다는 압축 된 데이터를 처리하는 방법에 대한 정보를 찾고 계신 것 같습니다. 대부분의 웹 서버는 그렇게하도록 구성된 경우 및 클라이언트가 요청에 필요한 헤더를 제공하면 자동으로 데이터를 압축합니다. 즉, 페이지를 전송하기 전에 압축 할 필요가 없으며 서버는 가능한 경우 자동으로 압축합니다.

캐싱의 경우 처리 된 버전의 페이지를 디스크 또는 메모리에 저장할 수 있습니다 (예 : memcache).

예를 들어 매시간마다 페이지를 업데이트하면 crontab과 같은 스크립트를 실행하여 매 시간마다 페이지를 생성하고 생성 된 페이지 만 제공 할 수 있습니다. 서버 측 캐싱과 관련하여 특별히 고려해야 할 사항이 없으므로 상당히 직선적이어야합니다.

반면에 캐시 된 버전이나 신선한 버전을 사용하기 전에 페이지가 오래되었다는 것을 확인해야하는 경우 조금 더 복잡해집니다. 예를 들어, 데이터가 오래되었다는 것을 확인하는 것이 페이지를 생성하는 것만큼이나 비용이 많이들 수도 있습니다.

자세한 내용 없이는 구체적인 답변을 드릴 수 없습니다.

public class MyFilter implements Filter { 

    private byte[] my_gzipped_page = .... 

    public void doFilter(ServletRequest req, ServletResponse res, 
     FilterChain chain) throws IOException, ServletException { 

     if (req instanceof HttpServletRequest) { 

      HttpServletRequest request = (HttpServletRequest) req; 
      HttpServletResponse response = (HttpServletResponse) res; 

      String ae = request.getHeader("accept-encoding"); 

      if (ae != null && ae.indexOf("gzip") != -1) { 

       response.addHeader("Content-Length", 
        Integer.toString(my_gzipped_page.length)); 
       response.addHeader("Content-Encoding", "gzip"); 

       OutputStream output = response.getOutputStream(); 
       output.write(my_gzipped_page); 
       output.flush(); 
       output.close(); 

       return; 

      } else ... 

     } 
    } 
    ... 
} 
+0

바이트 배열로 압축 된 버전의 페이지가 있다고 가정 할 때 http 응답에 어떻게 삽입합니까? 나는 매번 페이지를 압축하고 싶지 않다. 나는 웹 서버가 아닌 Tomcat을 다루고있다. – JVerstry

+0

음 Tomcat은 웹 서버입니다. 저는 스스로 익숙하지 않지만 표준 Java 서블릿을 사용한다고 가정하면 HttpServletResponse.addHeader()를 사용하여 필요한 헤더를 설정 한 다음 HttpServletResponse.getWriter()를 사용하여 바이트 배열을 전송할 수 있어야합니다.).인쇄(). – Nico

2

가 왜 어려운 방법을 수행 : 꽤 인터넷 검색 후

+1

하지만, 각 시간마다 바람둥이가 다시 압축됩니까? (나는 여전히 학습 곡선에있다.) – JVerstry

+0

예, 그렇습니다.하지만 걱정할 것은 아닙니다. GZIP은 특히 빠르고 저렴합니다. 웹 서버가 다른 CPU 집중적 인 작업을 수행하지 않습니다? 브라우저가 정해진 시간 동안 캐시에 페이지를 보관할 수 있도록 적절한 응답 캐싱 헤더 (만료, 마지막 수정 및 etag)를 필터로 설정하는 것이 좋습니다. – BalusC

+0

나는 적절한 캐싱 헤더와 완전히 동의한다. 사실, 나는 비교적 정적 인 페이지를위한 초고속 서블릿을 만들기 위해 여분의 마일을 갈 준비가되어있다. 나는 둘 다 사용할 계획이다. 많은 의견을 보내 주셔서 감사합니다. – JVerstry

관련 문제