カテゴリ: Jakarta EE 更新日: 2025/12/07

JakartaEE 圧縮フィルタ(Gzip)の仕組みと実装例を完全解説!初心者でもわかるサーブレット高速化

Jakarta EE 圧縮フィルタ(Gzip)の仕組みと実装例
Jakarta EE 圧縮フィルタ(Gzip)の仕組みと実装例

先生と生徒の会話形式で理解しよう

生徒

「先生、Webページを高速化する方法ってありますか?最近アプリが重い気がして…」

先生

「あるよ。JakartaEEではフィルタを使ってレスポンスをGzipで圧縮することで、データ転送を軽くして表示速度を改善できるんだ。」

生徒

「Gzipってブラウザでも対応してるんですか?」

先生

「もちろん。ほとんどのモダンブラウザはGzip圧縮をサポートしているから、サーバー側で圧縮フィルタを作れば簡単に導入できるんだよ。」

1. Gzip圧縮フィルタとは

1. Gzip圧縮フィルタとは
1. Gzip圧縮フィルタとは

Gzip圧縮フィルタは、JakartaEEのサーブレットフィルタ機能を活用して、HTTPレスポンスをクライアントに返す前に圧縮する仕組みです。圧縮することでネットワーク帯域の消費を減らし、ページ表示速度を向上させることができます。特にテキストベースのHTMLやCSS、JavaScriptのようなリソースでは効果が高く、Webアプリケーションのパフォーマンス最適化に欠かせない技術です。

2. Gzipフィルタの仕組み

2. Gzipフィルタの仕組み
2. Gzipフィルタの仕組み

ブラウザがサーバーにリクエストを送るとき、Accept-Encodingヘッダーにgzipが含まれていれば、サーバー側でレスポンスを圧縮して返すことができます。JakartaEEのフィルタではレスポンスストリームを書き換えることで、Gzip圧縮済みのレスポンスをクライアントに返す仕組みを実現します。

3. Gzip圧縮フィルタの実装例

3. Gzip圧縮フィルタの実装例
3. Gzip圧縮フィルタの実装例

以下はJakartaEEでGzip圧縮フィルタを作成するシンプルなサンプルコードです。


@WebFilter("/*")
public class GzipFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        String acceptEncoding = httpRequest.getHeader("Accept-Encoding");
        if (acceptEncoding != null && acceptEncoding.contains("gzip")) {
            GzipResponseWrapper gzipResponse = new GzipResponseWrapper(httpResponse);
            chain.doFilter(request, gzipResponse);
            gzipResponse.finishResponse();
        } else {
            chain.doFilter(request, response);
        }
    }
}

このフィルタは、ブラウザがGzipを受け入れる場合にのみレスポンスを圧縮して返します。

4. レスポンスラッパークラスの実装

4. レスポンスラッパークラスの実装
4. レスポンスラッパークラスの実装

Gzip圧縮を行うためには、レスポンスのOutputStreamをラップするクラスを作成します。


public class GzipResponseWrapper extends HttpServletResponseWrapper {
    private GZIPServletOutputStream gzipOutputStream;
    private PrintWriter printWriter;

    public GzipResponseWrapper(HttpServletResponse response) throws IOException {
        super(response);
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        if (gzipOutputStream == null) {
            gzipOutputStream = new GZIPServletOutputStream(getResponse().getOutputStream());
        }
        return gzipOutputStream;
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        if (printWriter == null) {
            printWriter = new PrintWriter(new OutputStreamWriter(getOutputStream(), getCharacterEncoding()));
        }
        return printWriter;
    }

    public void finishResponse() throws IOException {
        if (printWriter != null) {
            printWriter.close();
        }
        if (gzipOutputStream != null) {
            gzipOutputStream.close();
        }
    }
}

5. GZIPServletOutputStreamの実装

5. GZIPServletOutputStreamの実装
5. GZIPServletOutputStreamの実装

実際にレスポンスをGzipで圧縮するServletOutputStreamの実装例です。


public class GZIPServletOutputStream extends ServletOutputStream {
    private GZIPOutputStream gzipOutputStream;

    public GZIPServletOutputStream(OutputStream output) throws IOException {
        this.gzipOutputStream = new GZIPOutputStream(output);
    }

    @Override
    public void write(int b) throws IOException {
        gzipOutputStream.write(b);
    }

    @Override
    public void flush() throws IOException {
        gzipOutputStream.flush();
    }

    @Override
    public void close() throws IOException {
        gzipOutputStream.close();
    }

    @Override
    public boolean isReady() {
        return true;
    }

    @Override
    public void setWriteListener(WriteListener writeListener) {}
}

6. 実行結果の確認

6. 実行結果の確認
6. 実行結果の確認

実際にこのフィルタを導入すると、ブラウザの開発者ツールやcurlコマンドでレスポンスヘッダーを確認できます。


Content-Encoding: gzip

このヘッダーが返っていれば、レスポンスが圧縮されていることを意味します。

7. Gzip圧縮フィルタを使うメリット

7. Gzip圧縮フィルタを使うメリット
7. Gzip圧縮フィルタを使うメリット
  • レスポンスサイズを大幅に削減できる
  • ページ表示速度が向上し、ユーザー体験が改善する
  • ネットワーク帯域の節約につながる
  • JakartaEEのフィルタで簡単に導入可能

8. 導入時の注意点

8. 導入時の注意点
8. 導入時の注意点

すべてのレスポンスをGzip圧縮するとCPU負荷が増える可能性があるため、画像やPDFのようにすでに圧縮されているデータには適用しないようにする工夫が必要です。また、HTTPヘッダーの設定やクライアントの互換性も考慮して導入しましょう。

関連記事:
カテゴリの一覧へ
新着記事
New1
Play Framework
Play Frameworkでフォームデータをコントローラで扱う方法を完全解説|Java初心者向けコントローラ入門
New2
Jakarta EE
Jakarta EE JSPにおけるJSTLとスクリプトレットの違いと使い分けを初心者向けに徹底解説
New3
Play Framework
Play Frameworkでクエリパラメータをコントローラで処理する方法を完全解説|Java初心者向け入門
New4
Play Framework
Play FrameworkとSpring Bootの違いを徹底比較!初心者でもわかるJavaフレームワーク入門
人気記事
No.1
Java&Spring記事人気No1
Jakarta EE
Jakarta EEのリリースサイクルとバージョンの進化をやさしく解説!
No.2
Java&Spring記事人気No2
Jakarta EE
Jakarta サーブレットのHttpServletRequestを徹底解説!初心者でもわかる基本操作と使い方
No.3
Java&Spring記事人気No3
Jakarta EE
Jakarta EEとSpringの比較|どちらを選ぶべきか?初心者向けに徹底解説!
No.4
Java&Spring記事人気No4
Jakarta EE
Jakarta EEとJava EEアプリの互換性を完全解説!移行で困らないための基礎知識
No.5
Java&Spring記事人気No5
Jakarta EE
Jakarta EE JSPにおけるJSTL国際化タグ(fmt:message)の使い方を初心者向けに完全解説
No.6
Java&Spring記事人気No6
Jakarta EE
Jakarta EE JSPでJSTL SQLタグを使った簡易データベースアクセスをやさしく解説
No.7
Java&Spring記事人気No7
Jakarta EE
Jakarta EE JSPでJSTLを使ったJSONやREST APIレスポンス処理を初心者向けにやさしく解説
No.8
Java&Spring記事人気No8
Play Framework
Play Frameworkでリクエストデータの受け取り方を完全解説|Java初心者向けコントローラ入門