Androidクライアントがサーバ側と対話し、セッションの返信を維持する方法


前言
最近、プロジェクトの開発中にAndroidとwebサーバが同じセッションで通信する問題に遭遇しました.
一、SessionとCookieの共通性と区別:
①、共通性
CookieとSessionはいずれも状態情報を保存するためにクライアント状態を保存するメカニズムであり,HTTPの無状態の問題を解決するための努力である.
SessionはCookieで実現してもよいし,URL書き戻しのメカニズムで実現してもよい.
②、区別
1)Cookieは状態をクライアントに保存し、Sessionは状態をサーバ側に保存する.
2)Cookiesは,サーバがローカルマシン上に格納したセグメントテキストであり,各要求に従って同じサーバに送信される.ネットワークサーバはHTTPヘッダでクライアントにcookiesを送信し、クライアント端末ではブラウザがこれらのcookiesを解析してローカルファイルとして保存し、同じサーバの任意の要求を自動的にこれらのcookiesに縛り付けます.
3)Sessionは各ユーザに対するものであり、変数の値はサーバに保存され、1つのsessionIDで異なるユーザsession変数と区別され、この値はユーザのブラウザによってアクセス時にサーバに返され、クライアントがcookieを無効にした場合、この値はgetによってサーバに返されるように設定されることもある.
4)セキュリティについては、セッションを使用するサイトにアクセスし、自分のマシンにクッキーを作成すると、サーバ側のSESSIONメカニズムがより安全になることをお勧めします.お客様が格納している情報を任意に読み取ることはありません.
二、Sessionメカニズム
1)Sessionメカニズムはサーバ側のメカニズムであり,サーバはハッシュ・リストのような構造(つまりハッシュ・リストの使用)を用いて情報を保存する.
2)プログラムがクライアントの要求のためにセッションを作成する必要がある場合、サーバはまずこのクライアントの要求にセッションIDが含まれているかどうかをチェックする-セッションidと呼ばれ、セッションidが含まれている場合は以前にこのクライアントのためにセッションを作成したことを説明し、サーバはセッションidに従ってこのセッションを検索して使用する.(取得できない場合は新規作成する場合があります)クライアント要求にセッションidが含まれていない場合、このクライアントのためにセッションを作成し、このセッションに関連付けられたセッションidを生成します.セッションidの値は、重複しないし、シミュレーションのために規則が見つかりにくい文字列であるべきです.このセッションidは、今回の応答でクライアントに保存されます.
三、Sessionの実現方式
1 ) Cookieで実現
サーバはセッションごとに一意のJESSIONIDを割り当て,Cookieを介してクライアントに送信する.
クライアントが新しい要求を開始すると、このJESSIONIDはCookieヘッダに携帯される.これにより、サーバはこのクライアントに対応するセッションを見つけることができます.
 2)URLエコーで実現
URL書き戻しとは、サーバがブラウザページに送信するすべてのリンクにJESSIONIDのパラメータを携帯することであり、クライアントがどのリンクをクリックしてもJESSIONIDをサーバに与えることになる.ブラウザにurlを直接入力してリソースを要求すると、Sessionは一致しません.
TomcatによるSessionの実装は,最初はCookieとURL書き戻し機構を併用し,クライアントがCookieをサポートしていることを発見したらCookieを引き続き使用し,URL書き戻しの使用を停止する.Cookieが無効になっていることに気づいたら、URLを使って書き返します.jsp開発がセッションに処理されるときは、ページのリンクにresponse.encode URL()を使用することを忘れないでください.
 
四、まとめ
SessionとCookieを振り返ってみると、なぜ携帯電話側とサーバのインタラクションが同じsessionで実現されなかったのかという問題があります.
1)理由が簡単であるのは,android携帯端末がウェブサーバにアクセスする際にhttpリクエストヘッダにセッションIDを設定していないためであり,ウェブブラウザをクライアントとしてサーバにアクセスする場合,クライアントがリクエストを開始するたびに,インタラクション中のセッションID:JSESIONIDをCookieヘッダに設定して携帯するためである.サーバは、このセッションIDに基づいて、新しいセッションを再作成するのではなく、対応するセッションを取得します(このセッションが無効になった場合を除きます).
Java.NET.HttpURLConnectionによるリクエストの開始例:
  Cookie: 
URL url = new URL(requrl);
 HttpURLConnection con= (HttpURLConnection) url.openConnection(); 
//   sessionid. 
String cookieval = con.getHeaderField("set-cookie"); 
String sessionid; 
if(cookieval != null) { 
sessionid = cookieval.substring(0, cookieval.indexOf(";")); 
}
//sessionid   :JSESSIONID=AD5F5C9EEB16C71EC3725DBF209F6178,    ,     
    cookie: 
URL url = new URL(requrl);
HttpURLConnectioncon= (HttpURLConnection) url.openConnection(); 
if(sessionid != null) { 
con.setRequestProperty("cookie", sessionid); 
}

セッションIDが設定されている限り、Webサーバはリクエストを受信すると自動的に対応するセッションを検索し、同じセッションでセッションを保証します.
以下は私個人がまとめたHttpリクエストのコードです.
private static String session_id = null;

public static String httpRequest(String requrl) {
        String result = null;//         
        try {
            URL url = new URL(requrl);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            if (session_id != null) {
                con.setRequestProperty("Cookie", session_id);//  sessionid
            }
            InputStream is = con.getInputStream();
            String cookieval = con.getHeaderField("Set-Cookie");
            if (cookieval != null) {
                session_id = cookieval.substring(0, cookieval.indexOf(";"));//  sessionid
                L.w("SESSION", "session_id=" + session_id);
            }

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) > 0) {
                bos.write(buffer, 0, len);
            }
            bos.flush();
            is.close();
            byte[] resultbyte = bos.toByteArray();
            result = bos.toString();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

注:OKHttpの開発フレームワークを使用している場合は、次の章Android OKHttpの使用心得では、セッションの有効期限が切れた場合にOKHttpを使用してセッションを維持する方法について説明します
リファレンス
http://blog.csdn.net/zxc123e/article/details/41698027
http://blog.csdn.net/yaochangliang159/article/details/50433682