GET メソッドで URL を呼び出して、呼び出し先のセッションが有効である事を確認します
HttpGet.java
1) CookieManager を static で作成して呼び出し先のセッションを有効にします。
2) 実行時の引数に QueryString 用の Map を使用可能にして、必要なければ null を指定します
package app.lightbox.winofsql.jp.sessionid;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
/**
* Created by lightbox on 2015/06/01.
*/
public class HttpGet {
// セッションを有効にする為、常に存在させるよう static で定義
private static CookieManager manager = null;
// **********************************************
// コンストラクタ
// **********************************************
public HttpGet() {
if ( manager == null ) {
manager = new CookieManager();
// 以下をコメントにするとセッションは働きません
CookieHandler.setDefault(manager);
}
}
// **********************************************
// 指定した URL へ 任意の charset で処理
// **********************************************
public String execute(String targetUrl,String targetCharset,Map<String,String> params) {
StringBuffer web_data = new StringBuffer();
try {
// **********************************************
// Query String の作成( 必要無ければ引数を null とする )
// **********************************************
String data = "";
if ( params != null ) {
Iterator<String> it = params.keySet().iterator();
String key = null;
String value = null;
while(it.hasNext()) {
key = it.next().toString();
value = params.get(key);
if ( !data.equals("") ) {
data += "&";
}
data += key + "=" + URLEncoder.encode(value, targetCharset) ;
}
if ( !data.equals("") ) {
targetUrl = targetUrl + "?" + data;
}
}
// **********************************************
// インターネットへの接続
// **********************************************
// 読み込む WEB上のターゲット
URL url = new URL(targetUrl);
// 接続オブジェクト
HttpURLConnection http = (HttpURLConnection)url.openConnection();
// GET メソッド
http.setRequestMethod("GET");
// 接続
http.connect();
// **********************************************
// ストリームとして読み込む準備
// **********************************************
// 以下読み込み3点セット InputStream / InputStreamReader / BufferedReader
InputStream input_stream = http.getInputStream();
// UTF-8 でリーダーを作成
InputStreamReader input_stream_reader = new InputStreamReader(input_stream, targetCharset);
// 行単位で読み込む為の準備
BufferedReader buffered_reader = new BufferedReader(input_stream_reader);
// **********************************************
// 行の一括読み込み
// **********************************************
String line_buffer = null;
// BufferedReader は、readLine が null を返すと読み込み終了
while ( null != (line_buffer = buffered_reader.readLine() ) ) {
web_data.append( line_buffer );
web_data.append( "\n" );
}
// **********************************************
// 接続解除
// **********************************************
http.disconnect();
}
catch(Exception e) {
// 失敗
System.out.println( e.getMessage());
}
return web_data.toString();
}
}
関連する記事
Eclipse + JFace : HttpURLConnection で GET
session_id.php : セッション確認用の PHPコード
QueryString のテスト用に、$_GET['display'] をセットした場合、$_SERVER の内容を返すようにしています。
Android 側で複数回呼び出して、session_id の表示が毎回同じであればセッションが有効です
<?php
session_start();
header( "Content-Type: text/html; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
print session_id();
if ( $_GET['display'] == '環境' ) {
print "\n";
print_r( $_SERVER );
}
?>
HttpGet を呼び出して画面へ結果をセット
ボタンを配置し、その下に ScrollView を置いて、その中の TextView に表示します。( Android のインターネットアクセスなので、AsyncTask を使用しています )
呼び出し先は、localhost に用意しているので、Android の中からは 10.0.2.2 で呼び出します
( Special alias to your host loopback interface / i.e., 127.0.0.1 on your development machine )
Button button = (Button) this.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AsyncTask<String, Void, String>() {
// 非同期処理
@Override
protected String doInBackground(String... params) {
// インターネットアクセス
HttpGet hg = new HttpGet();
Map map = new HashMap();
map.put("display", "環境");
String result = hg.execute(params[0], params[1],map);
return result;
}
// UI スレッド処理
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
TextView tv = (TextView) MainActivity.this.findViewById(R.id.textView);
tv.setText(s);
}
}.execute("http://10.0.2.2/basic/session_id.php", "utf-8");
}
});
※ インターネットアクセスには、AndroidManifest に android.permission.INTERNET が必要です
関連する記事
Android Studio で AsyncTask / Android Studio ならではの操作でコードを楽々作成
画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="表示"
android:id="@+id/button"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/scrollView"
android:layout_below="@+id/button"
android:layout_marginTop="16dp"
android:layout_alignParentStart="true"
android:background="@android:color/white">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/textView"
android:layout_below="@+id/button"
android:layout_alignParentStart="true"
android:background="#ffffffff"/>
</ScrollView>>
</RelativeLayout>
CookieManager を使用した HttpPost クラス
package app.lightbox.winofsql.jp.sessionid;
import android.util.Log;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookieStore;
import java.net.HttpCookie;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Created by lightbox on 2015/06/01.
*/
public class HttpPost {
// セッションを有効にする為、常に存在させるよう static で定義
private static CookieManager manager = null;
// **********************************************
// コンストラクタ
// **********************************************
public HttpPost() {
if ( manager == null ) {
manager = new CookieManager();
// 以下をコメントにするとセッションは働きません
buildCookieManager();
}
}
// **********************************************
// CookieManager 作成
// **********************************************
private void buildCookieManager() {
manager = new CookieManager();
CookieHandler.setDefault(manager);
}
// **********************************************
// Cookie の表示テスト
// **********************************************
public void showCookie() {
CookieStore store = manager.getCookieStore();
List<HttpCookie> cookies = store.getCookies();
for (int i = 0; i < cookies.size(); i++) {
HttpCookie cookie = cookies.get(i);
Log.i("lightbox", "Cookie[" + i + "]: " + cookie);
}
}
// **********************************************
// 指定した内容で処理
// **********************************************
public String execute(String targetUrl,String targetCharset,Map<String,String> params) {
StringBuffer get_data = null;
try {
// ターゲット
URL url = new URL(targetUrl);
// 接続オブジェクト
HttpURLConnection http = (HttpURLConnection)url.openConnection();
http.setConnectTimeout(30000);
http.setReadTimeout(30000);
http.setDoInput(true); // application/x-www-form-urlencoded がセットされる
http.setRequestMethod("POST");
OutputStreamWriter osw = new OutputStreamWriter(http.getOutputStream());
BufferedWriter bw = new BufferedWriter(osw);
Iterator<String> it = params.keySet().iterator();
String key = null;
String value = null;
String data = "";
while(it.hasNext()) {
key = it.next().toString();
value = params.get(key);
if ( !data.equals("") ) {
data += "&";
}
data += key + "=" + URLEncoder.encode(value, targetCharset) ;
}
Log.i("lightbox", "送信内容 : " + data);
bw.write(data);
bw.close();
osw.close();
// 以下読み込み3セット
InputStream i_stream = http.getInputStream();
// UTF-8 でリーダーを作成
InputStreamReader i_stream_reader = new InputStreamReader(i_stream, targetCharset);
// 行単位で読み込む為の準備
BufferedReader b_reader = new BufferedReader(i_stream_reader);
// 行の一括読みこみ
String line_buffer;
get_data = new StringBuffer();
// BufferedReader は、readLine が null を返すと読み込み終了
while ( null != (line_buffer = b_reader.readLine() ) ) {
get_data.append( line_buffer );
get_data.append( "\n" );
}
// 接続解除
http.disconnect();
}
catch(Exception e) {
// 失敗
System.out.println( e.getMessage());
}
return get_data.toString();
}
}
http://toolbox.winofsql.jp/log.php は、セッションを使用した簡易掲示板のデモページです。
デモページ