1概要

この記事では、Javaネットワーク・プログラミングを使った低レベルの操作について探ります。 Cookieについてもっと詳しく見ていきます。

Javaプラットフォームには、

java.net

パッケージにまとめられた、組み込みのネットワークサポートが付属しています。

import java.net.** ;


2 HTTPクッキー

クライアントがHTTP要求をサーバーに送信し、それに対する応答を受信するたびに、サーバーはこのクライアントについて忘れます。次回クライアントが再度要求するときは、まったく新しいクライアントと見なされます。

ただし、Cookieを使用すると、サーバーが複数の要求と応答のペアにまたがってクライアントを記憶できるように、クライアントとサーバーの間にセッションを確立することができます。

今後のこのセクションから、Javaネットワークプログラミングにおけるクライアントサーバー間通信を強化するためにクッキーを使用する方法を学びます。

Cookieを処理するための

java.net

パッケージのメインクラスは

CookieHandler

です。

CookieManager



CookiePolicy



CookieStore

、および

HttpCookie

などの他のヘルパークラスとインタフェースがあります。


3

CookieHandler

クラス

このシナリオを考えてください。

Homepage




、またはHTTPプロトコルを使用するその他のURLのサーバーと通信している場合、URLオブジェクトはHTTPプロトコルハンドラと呼ばれるエンジンを使用します。

このHTTPプロトコルハンドラは、システムにデフォルトの

CookieHandler

インスタンスがあるかどうかを確認します。もしあれば、それは州管理を担当するためにそれを呼び出す。

そのため、

CookieHandler

クラスには、HTTPプロトコルハンドラを利用するためのコールバックメカニズムを提供するという目的があります。


CookieHandler

は抽象クラスです。現在の

CookieHandler

インストールを取得するために呼び出すことができる静的な

getDefault()

メソッドを持っています。あるいは私たちは自分自身を設定するために

setDefault(CookieHandler)

を呼び出すことができます。

setDefault

を呼び出すと、システム全体で

CookieHandler

オブジェクトがインストールされます。

CookieをCookieストアに保存するための__put(uri、responseHeaders)もあります。これらのクッキーは、与えられたURIからのHTTPレスポンスのレスポンスヘッダから取得されます。応答があるたびに呼び出されます。

関連するAPIメソッド

get(uri、requestHeaders)は、指定されたURIに保存されているCookieを取得し、それらを

requetHeaders__に追加します。リクエストが行われる直前に呼び出されます。

これらのメソッドはすべて

CookieHandler

の具象クラスに実装する必要があります。この時点で、

CookieManager

クラスが注目に値します。このクラスは最も一般的なユースケースのための

CookieHandler

クラスの完全な実装を提供します。

次の2つのセクションでは、

CookieManager

クラスについて説明します。最初はデフォルトモードで、後でカスタムモードで。


4デフォルト

CookieManager


完全なクッキー管理フレームワークを持つためには、

CookiePolicy



CookieStore

の実装が必要です。


CookiePolicy

は、Cookieの受け入れと拒否の規則を定めています。私達は私達の必要性に適するために当然これらの規則を変えることができる。

次に –

CookieStore

は正確にその名前が示すとおりの動作をします。クッキーを保存および取得するためのメソッドがあります。必要に応じて、ここでもストレージメカニズムを微調整できます。

まずデフォルトを見てみましょう。デフォルトの

CookieHandler

を作成し、それをシステム全体のデフォルトとして設定するには、次のようにします。

CookieManager cm = new CookieManager();
CookieHandler.setDefault(cm);

デフォルトの

CookieStore

には揮発性メモリがあります。つまり、JVMの有効期間中のみ有効です。クッキーのためにより永続的なストレージを持つためには、それをカスタマイズしなければなりません。


CookiePolicy

に関しては、デフォルトの実装は

CookiePolicy.ACCEPT

ORIGINAL

SERVER

です。つまり、レスポンスがプロキシサーバーを介して受信された場合、Cookieは拒否されます。


5カスタム

CookieManager


独自の

CookiePolicy

または

CookieStore

(あるいはその両方)のインスタンスを提供して、デフォルトの

CookieManager

をカスタマイズしましょう。


5.1.

クッキーポリシー



CookiePolicy

は、便宜上いくつかの定義済み実装を提供します。


  • CookiePolicy.ACCEPT

    ORIGINAL

    SERVER

    – 元のCookieのみ

サーバーを保存することができます(デフォルトの実装)
**

CookiePolicy.ACCEPT

ALL__ – すべてのクッキーを保存することができます

その起源
**

CookiePolicy.ACCEPT

NONE__ – クッキーを保存できません

独自の実装を行わずに現在の

CookiePolicy

を単純に変更するには、

CookieManager

インスタンスの

setCookiePolicy

を呼び出します。

CookieManager cm=new CookieManager();
cm.setCookiePolicy(CookiePolicy.ACCEPT__ALL);

しかし、これ以上のカスタマイズは可能です。

CookiePolicy.ACCEPT

ORIGINAL

SERVER

の動作を理解した上で、特定のプロキシサーバーを信頼し、それから元のサーバーの上にあるCookieを受け入れたいとしましょう。


CookiePolicy

インターフェースを実装し、

shouldAccept

メソッドを実装する必要があります。ここで、選択したプロキシサーバーのドメイン名を追加して承認規則を変更します。

新しいポリシー

ProxyAcceptCookiePolicy

を呼び出しましょう。指定されたプロキシアドレス以外の

shouldAccept

実装からの他のプロキシサーバーを基本的に拒否し、

CookiePolicy.ACCEPT

ORIGINAL

SERVER



shouldAccept

メソッドを呼び出して実装を完了します。

public class ProxyAcceptCookiePolicy implements CookiePolicy {
    private String acceptedProxy;

    public boolean shouldAccept(URI uri, HttpCookie cookie) {
        String host = InetAddress.getByName(uri.getHost())
          .getCanonicalHostName();
        if (!HttpCookie.domainMatches(acceptedProxy, host)) {
            return false;
        }

        return CookiePolicy.ACCEPT__ORIGINAL__SERVER
          .shouldAccept(uri, cookie);
    }

   //standard constructors
}


ProxyAcceptCookiePolicy

のインスタンスを作成するときに、元のサーバーに加えて、Cookieを受け付けるドメインアドレスの文字列を渡します。

次に、このインスタンスをデフォルトのCookieHandlerとして設定する前に、

CookieManager

インスタンスのCookieポリシーとして設定します。

CookieManager cm = new CookieManager();
cm.setCookiePolicy(new ProxyAcceptCookiePolicy("baeldung.com"));
CookieHandler.setDefault(cm);

このようにして、Cookieハンドラーは元のサーバーからのすべてのCookie、および

Homepage




からのCookieもすべて受け入れます。


5.2.

CookieStore



CookieManager

は、HTTP応答ごとに

CookieStore

にCookieを追加し、HTTP要求ごとに

CookieStore

からCookieを取得します。

デフォルトの

CookieStore

実装は永続性を持たず、JVMを再起動するとデータをすべて失います。コンピュータのRAMのようなものです。

そのため、

CookieStore

実装をハードディスクのように動作させ、JVMを再起動してもCookieを保持したい場合は、ストレージと取得のメカニズムをカスタマイズする必要があります。

注意しなければならないのは、作成後に

CookieStore

インスタンスを

CookieManager

に渡すことはできないということです。私たちの唯一の選択肢は、

CookieManager

の作成中にそれを渡すか、new __CookieManager()。getCookieStore()を呼び出してその動作を補完することによってデフォルトインスタンスへの参照を取得することです。

これが

PersistentCookieStore

の実装です。

public class PersistentCookieStore implements CookieStore, Runnable {
    private CookieStore store;

    public PersistentCookieStore() {
        store = new CookieManager().getCookieStore();
       //deserialize cookies into store
        Runtime.getRuntime().addShutdownHook(new Thread(this));
    }

    @Override
    public void run() {
       //serialize cookies to persistent storage
    }

    @Override
    public void add(URI uri, HttpCookie cookie) {
        store.add(uri, cookie);

    }

   //delegate all implementations to store object like above
}

コンストラクターのデフォルト実装への参照を取得したことに注意してください。

JVMがシャットダウンしているときに実行されるシャットダウンフックを追加できるように、

runnable

を実装しています。

run

メソッドの内部では、すべてのCookieをメモリに保存します。

データをファイルまたは任意の適切なストレージにシリアル化できます。また、コンストラクター内で、最初に永続メモリーからすべてのCookieを

CookieStore

に読み込みます。これら2つの単純な機能により、デフォルトの

CookieStore

は基本的に永続的になります(単純化された方法で)。


6. 結論

このチュートリアルでは、HTTP Cookieについて説明し、それらにプログラムでアクセスして操作する方法を示しました。

記事の全ソースコードとすべてのコードスニペットはhttps://github.com/eugenp/tutorials/tree/master/core-java/src/main/java/com/baeldung/networking[GitHubプロジェクトにあります。]。