【C#】WebBrowser読み込み完了後にCookieを取得しWebClientに引き渡す

WindowsForm上にWebBrowserを表示し、
読み込んだサイトのCookieをWebBrowserからWebClientに引き渡して処理を行います。

1# Form1.cs
2namespace WindowsFormsApplication1
3    public partial class Form1 : Form
4    {
5        public Form1()
6        {
7            InitializeComponent();
8            webBrowser1.Navigate("http://test1/");
9        }
10 
11        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
12        {
13            // クッキーを取得する。
14            string cookieStr = webBrowser1.Document.Cookie;
15 
16            // WebClientを生成する。
17            WebClient wc = new WebClient();
18            Encoding enc = Encoding.UTF8;
19 
20            // WebClientのヘッダ設定を行う。
21            // wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)");
22            wc.Headers[HttpRequestHeader.Cookie] = cookieStr;
23 
24            // WebClientでクッキーを引き継いで他のサイトにアクセスする。
25            byte[] result = wc.DownloadData("http://test2/");
26            string html = enc.GetString(result);
27            Console.WriteLine(html);
28 
29            // クッキーの中身を確認する。
30            // string[] cookieAry = cookieStr.Split(';');
31            // foreach (string str in cookieAry)
32            // {
33            //    MessageBox.Show(str);
34            // }
35        }
36    }
37}

【VisualStudio】オブジェクトにイベント追加

WindowsForm上にあるオブジェクトにイベントを追加します。
ボタンであればデザイナ上でボタンをダブルクリックすれば
イベント追加の設定が自動で行われますが、他のオブジェクトの場合の追加方法です。

オブジェクトをアクティブにしたら右下のプロパティの稲妻マークをクリックします。
ここに表示されているものが定義できるイベントの一覧で
白いテキストボックスをクリックするとイベント追加の設定が自動で行われます。

例として、WindowsForm上に「WebBrowser」を配置し、
WebBrowserでページ読み込み完了後を検知して処理を行いたい場合、
オブジェクトをアクティブにしたら右下のプロパティの稲妻マークをクリックし、
「DocumentCompleted」を選択すると、
イベント追加の設定が自動で行われ、「webBrowser1_DocumentCompleted」が生成されます。

1# Form1.Designer.cs
2namespace WindowsFormsApplication1
3    partial class Form1
4    {
5        private void InitializeComponent()
6        {
7            this.webBrowser1.Location = new System.Drawing.Point(52, 193);
8            this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
9            this.webBrowser1.Name = "webBrowser1"
10            this.webBrowser1.Size = new System.Drawing.Size(508, 213);
11            this.webBrowser1.TabIndex = 2;
12            this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
13        }
14    }
15}
1# Form1.cs
2namespace WindowsFormsApplication1
3    public partial class Form1 : Form
4    {
5        public Form1()
6        {
7            InitializeComponent();
8        }
9 
10        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
11        {
12            // ここにページ読み込み完了後の処理を記載する。
13        }
14    }
15}

【JScript】ディレクトリ内の全てのファイルを開き特定文字を置換する(行単位)

対象ディレクトリ内のファイルを行単位で読込み、置換を行います。
今回はテキストエリアの中身をCSVに出力したファイルの末尾が改行になっているものを
強制的に除去しているだけで、実際は置換していません。

対象の大量ファイルは「C:/replaceBefore」にあるとし、
置換後の大量ファイルを作成するために「C:/replaceAfter」を作成しておきます。

1var fso = new ActiveXObject("Scripting.FileSystemObject");
2var files = fso.GetFolder("D:/replaceBefore").Files;
3var e = new Enumerator(files);
4// ディレクトリ内の全てのファイル分繰り返す。
5for ( ; !e.atEnd(); e.moveNext()) {
6    var file = e.item();
7    var fileFullPathBefore = "D:/replaceBefore/" + file.Name;
8    var fileFullPathAfter  = "D:/replaceAfter/" + file.Name;
9    WScript.Echo(fileFullPathBefore + "を処理します。");
10 
11    // 入力ファイルの設定
12    // Typeの設定値
13    // 1:バイナリを表す。
14    // 2:既定値。charsetで指定した文字セットで文字列を表す。
15    var sr = new ActiveXObject("ADODB.Stream");
16    sr.Type = 2;
17    sr.charset = "utf-8";
18    sr.Open();
19    sr.LoadFromFile(fileFullPathBefore);
20 
21    // 出力ファイルの設定
22    var sw = new ActiveXObject("ADODB.Stream");
23    sw.Type = 2;
24    sw.charset = "utf-8";
25    sw.Open();
26 
27    // 入力ファイルの読込み
28    // 入力ファイルがEOSになるまで繰り返す。
29    while (!sr.EOS) {
30 
31        // ReadTextの第1引数
32        // -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
33        // -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
34        var temp = sr.ReadText(-2);
35 
36        // 置換文字列検索用
37        // RegExpの第2引数に'g'を指定すると全置換になる。
38//        var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}");
39//        var reg = new RegExp("[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{7}", 'g');
40//        temp = temp.replace(reg, "");
41 
42        // 出力ファイルの書込み
43        // WriteTextの第2引数
44        // ActiveXObjectのTypeが文字列(2)の場合に利用する。
45        // 0:既定値。文字列を書き込む。
46        // 1:文字列+改行を書き込む
47        // 末尾の1文字を取得する。
48        var lastWord = temp.slice(-1);
49        // 末尾がダブルクォートである場合
50        if (lastWord == "\"") {
51//            WScript.Echo("ダブルクォート");
52            // 文字列+改行を書き込む。
53            sw.WriteText(temp, 1);
54        // 末尾がダブルクォート以外である場合
55        } else {
56//            WScript.Echo("違う");
57            // 文字列を書き込む。
58            sw.WriteText(temp, 0);
59        }
60    }
61 
62    // 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
63    // 書き込んだオブジェクトのポジションをゼロに戻し、
64    // バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
65    // この処理順序は変更不可。
66    if (sw.charset == "utf-8") {
67        sw.Position = 0;
68        sw.Type = 1;
69        sw.Position = 3;
70        var textBinary = sw.Read();
71        sw.Close();
72        sw.Type = 1;
73        sw.Open();
74        sw.Write(textBinary);
75    }
76 
77    sr.Close();
78    sr = null;
79 
80    // 出力ファイルの保存
81    // SaveToFileの第2引数
82    // 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
83    // 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
84    sw.SaveToFile(fileFullPathAfter, 2);
85    sw.Close();
86    sw = null;
87}
88fso = null;

【VPNサーバ】OpenVPN設定後のファイル構成

  • 設定完了後のフォルダ構成

    1# 共通ファイル配置場所
    2cd /etc/openvpn
    3ls -l
    4-rw------- 1 root root  1168  9月  3 15:59 2016 ca.crt:CA証明書(サーバとクライアントの両方で利用)
    5-rw----r-- 1 root root   682  9月  3 16:31 2016 crl.pem:証明書廃止リスト
    6-rw------- 1 root root   424  9月  3 16:26 2016 dh.pem:DHパラメータ
    7drwxr-xr-x 4 root root  4096  9月  3 15:52 2016 easyrsa3:SSL/TLSプロトコルを利用した暗号化ツール
    8-rwxr-xr-x 1 root root   530  9月  3 17:07 2016 openvpn-shutdown:OpenVPN停止時実行スクリプト
    9-rwxr-xr-x 1 root root   670  9月  3 17:03 2016 openvpn-startup:OpenVPN起動時実行スクリプト
    10-rw-r--r-- 1 root root 10593  9月  3 19:29 2016 server.conf:OpenVPN設定ファイル
    11-rw------- 1 root root  4448  9月  3 16:03 2016 server.crt;サーバ証明書
    12-rw------- 1 root root  1704  9月  3 16:03 2016 server.key:サーバ秘密鍵
    13-rw------- 1 root root   636  9月  3 16:35 2016 ta.key:SSL/TLS認証鍵
    1# 証明書配置場所
    2cd /etc/openvpn/easyrsa3/pki/issued
    3ls -l
    4-rw------- 1 root root 4423  9月  3 16:27 2016 dmy.crt:クライアント(ダミー用)証明書(廃止済)
    5-rw------- 1 root root 4432  9月  3 22:56 2016 クライアント名.crt:クライアント(iphoneやタブレット用)証明書
    6-rw------- 1 root root 4448  9月  3 16:03 2016 server.crt:サーバ証明書(共通ファイル配置場所にコピーしたもの)
    1# 秘密鍵配置場所
    2cd /etc/openvpn/easyrsa3/pki/private
    3ls -l
    4-rw------- 1 root root 1834  9月  3 15:58 2016 ca.key:CA秘密鍵
    5-rw------- 1 root root 1708  9月  3 16:27 2016 dmy.key:クライアント(ダミー用)秘密鍵(廃止済)
    6-rw------- 1 root root 1704  9月  3 22:56 2016 クライアント名.key:クライアント(iphoneやタブレット用)秘密鍵
    7-rw------- 1 root root 1704  9月  3 16:02 2016 server.key:サーバ秘密鍵

【VPNサーバ】OpenVPNファイルウォール設定

  • OpenVPNファイアウォール設定

    1# OpenVPNファイアウォール設定
    2iptables -I INPUT 16 -p udp --dport 1194 -j ACCEPT
    3service iptables save
    1# 設定内容の確認
    2# フィルタリングの確認(-t filter省略)
    3iptables -L --line-numbers -n -v
    4# アドレス変換の確認(-t nat)
    5iptables -L -t nat --line-numbers -n -v

    この設定ではiPhone5sからVPNサーバに接続できても
    各サーバにPingが飛ばせませんでした。
    どこか設定をミスしているのかも。
    以下の設定を追加してみても変化なし。

    1iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o eth0 -j SNAT --to 192.168.11.30
    2service iptables save

    「/var/log/message」を確認するとiPhone5sからLZOのエラーが出ていたので、
    そこを改善すれば直るのかは確認中です。

【VPNサーバ】OpenVPN設定(クライアント用)

  • OpenVPN設定(クライアント側パスワード有)
    iPhone以外でパスワード有りでログインする場合、こっちを選択。

    1# クライアント用の証明書作成
    2cd /etc/openvpn/easyrsa3/
    3./easyrsa build-client-full クライアント名
    下記内容を入力
    Enter PEM pass phrase:クライアント用パスワードを入力
    Verifying - Enter PEM pass phrase:クライアント用パスワードを入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
  • OpenVPN設定(クライアント側パスワード無)
    iPhoneやパスワード無しでログインする場合、こっちを選択。

    1# クライアント用の証明書作成
    2cd /etc/openvpn/easyrsa3/
    3./easyrsa build-client-full クライアント名 nopass
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
  • iPhone用のOpenVPN設定
    WindowsのOpenVPNクライアントをインストールし、
    インストール後、「インストールディレクトリ/OpenVPN/sample-config/client.ovpn」を編集する。
    iPhone用は設定値のみとし、#のコメントも削除する。

    下記内容を確認/追加/変更
    # TLSクライアントを指定
    tls-client
    
    # VPNインターフェースとしてtunデバイスを指定
    dev tun
    
    # プロトコルとしてudp
    proto udp
    
    # サーバ名とポートを指定
    remote z-area.net 1194
    
    # 名前解決試みのリトライ数(無限)
    resolv-retry infinite
    
    # ローカルポートをバインドしない
    nobind
    
    # 再接続時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # Man-in-the-Middle攻撃対策
    remote-cert-tls server
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNのログ設定
    verb 3
    
    # 鍵の設定と思われるがいまいち不明
    # しかしこの記述がないと接続できなかった
    key-direction 1
    
  • iPhone用の秘密鍵の変換
    「X509」というエラーが出いてた場合、
    iPhoneのOpenVPNクライアントアプリのTLS/SSLがPolarSSLを利用している場合があり、
    OpenSSLと秘密鍵のフォーマットが異なり、接続できないことがある。
    そこで以下のコマンドで秘密鍵を変換する。

    1openssl rsa -in /etc/openvpn/easyrsa3/pki/private/クライアント名.key -out /etc/openvpn/easyrsa3/pki/private/クライアント名.key.polarssl

【VPNサーバ】OpenVPN設定

  • OpenVPN設定

    1# OpenVPN設定ファイルをOpenVPN設定ファイル格納ディレクトリへコピー
    2cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
    3# OpenVPN設定ファイルを編集
    4vi /etc/openvpn/server.conf
    下記内容を確認/追加/変更
    # VPNインターフェースとしてtunデバイスを指定
    dev tun
    
    # プロトコルとしてudp、ポートは1194を指定
    proto udp
    port 1194
    
    # 認証局証明書、サーバー証明書、サーバー秘密鍵のファイルパスを指定
    # 配置場所を変更している場合、変更する
    ca ca.crt
    cert server.crt
    key server.key
    
    # DHパラメータファイルのパスを指定
    # 配置場所を変更している場合、変更する
    dh dh.pem
    
    # VPNクライアント割当てアドレス範囲として10.8.0.0/24を指定(デフォルト)
    server 10.8.0.0 255.255.255.0
    
    # LAN(例:192.168.1.0/24)へのルートをVPNサーバー経由にする
    ;push "route 192.168.10.0 255.255.255.0"
    ;push "route 192.168.20.0 255.255.255.0"
    push "route 192.168.11.0 255.255.255.0"
    
    # TLS認証有効化(行頭の;を削除し、コメント解除)
    tls-auth ta.key 0 # This file is secret
    
    # OpenVPN実行権限を下げる(行頭の;を削除し、コメント解除)
    user nobody
    group nobody
    
    # 起動時に鍵読み込み、tunデバイスオープン
    persist-key
    persist-tun
    
    # ログの設定
    status /var/log/openvpn-status.log
    log-append  /var/log/openvpn.log
    verb 3
    
    # LZO圧縮を利用
    comp-lzo
    
    # OpenVPNクライアントのIP固定設定を利用しない
    # 利用する場合、行頭の;を削除
    ;client-config-dir ccd
    
    # 管理インタフェースの有効化(最終行に追加)
    # 証明書廃止リストの有効化(最終行に追加)
    management localhost 7505
    crl-verify crl.pem
    
    # OpenVPN経由でSambaへのアクセスがエラーになる場合、最終行に追加
    fragment 1280
    mssfix 1280
    link-mtu 1400
    
  • OpenVPN起動時実行スクリプト作成

    1# OpenVPN起動時実行スクリプト作成
    2vi /etc/openvpn/openvpn-startup
    1#!/bin/bash
    2 
    3# VPN用のiptablesルール削除スクリプト実行(初期化)
    4/etc/openvpn/openvpn-shutdown
    5 
    6# VPNサーバーからの送信を許可
    7iptables -I OUTPUT -o tun+ -j ACCEPT
    8iptables -I FORWARD -o tun+ -j ACCEPT
    9 
    10# VPNクライアントからVPNサーバーへのアクセスを許可
    11iptables -I INPUT -i tun+ -j ACCEPT
    12 
    13# VPNクライアントからLANへのアクセスを許可
    14# VPNクライアントから192.168.11.0/24へのアクセスを許可する場合、
    15# 192.168.11.0/24側のファイアウォール等でVPNクライアント(10.8.0.0/24)からのアクセスを許可すること
    16iptables -I FORWARD -i tun+ -d 192.168.11.0/24 -j ACCEPT
    1# OpenVPN起動時実行スクリプトへ実行権限付加
    2chmod +x /etc/openvpn/openvpn-startup
  • OpenVPN停止時実行スクリプト新規作成

    1# OpenVPN停止時実行スクリプト新規作成
    2vi /etc/openvpn/openvpn-shutdown
    1#!/bin/bash
    2 
    3# VPNインタフェース(tun+)用iptablesルール削除関数
    4delete() {
    5    rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
    6    for num in $rule_number
    7    do
    8        iptables -D $target $num
    9    done
    10}
    11 
    12# VPNインタフェース(tun+)用iptables受信ルール削除
    13target='INPUT'
    14delete
    15 
    16# VPNインタフェース(tun+)用iptables転送ルール削除
    17target='FORWARD'
    18delete
    19 
    20# VPNインタフェース(tun+)用iptables送信ルール削除
    21target='OUTPUT'
    22delete
    1# OpenVPN停止時実行スクリプトへ実行権限付加
    2chmod +x /etc/openvpn/openvpn-shutdown
  • OpenVPNログローテーション設定

    1# OpenVPNログローテーション設定ファイル新規作成
    2vi /etc/logrotate.d/openvpn
    1/var/log/openvpn.log {
    2    missingok
    3    notifempty
    4    sharedscripts
    5    postrotate
    6        systemctl restart openvpn 2>&1 > /dev/null || true
    7    endscript
    8}
  • OpenVPN起動スクリプト変更

    1# OpenVPN起動スクリプト変更
    2vi /etc/rc.d/init.d/openvpn
    下記内容を変更
    # 行頭の#を削除し、コメント解除
    # パケット転送を有効化する
    echo 1 > /proc/sys/net/ipv4/ip_forward
    

【VPNサーバ】OpenVPN導入

RaspberryPiがとうとう壊れしまったので、
NUCにOpenVPNを導入します。
導入はrootユーザで実施します。

  • OpenVPN導入

    1cd /usr/local/src
    2# OpenVPNインストールに必要なパッケージをインストール
    3yum -y install openssl-devel lzo-devel pam-devel
    4# 最新の OpenVPN をダウンロードしてビルド
    5# 最新版は公式サイトで確認
    7rpmbuild -tb --clean openvpn-2.3.10.tar.gz
    8yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.3.10-1.x86_64.rpm
    9rm -f ~/rpmbuild/RPMS/x86_64/openvpn-*
    10rm -f openvpn-2.3.10.tar.gz
    1# easyrsa をダウンロードして解凍
    2# OpenVPNをインストールするとOpenSSLを簡単に利用できるツール「easy-rsa」が
    3# 「/usr/share/doc/openvpn/examples/easy-rsa/2.0」にインストールされるが、
    4# 最新版の3.0をダウンロードします。
    6unzip master.zip
    7cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/
    8rm -rf easy-rsa-master/
    9rm -f master.zip
  • 証明書初期化(OpenVPN導入後の1回のみ)

    1cd /etc/openvpn/easyrsa3/
    2./easyrsa init-pki
  • CA証明書と秘密鍵作成

    下記内容を入力
    Enter PEM pass phrase:任意のパスワードを入力
    Verifying - Enter PEM pass phrase:任意のパスワードを再入力
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:z-area.net
    
    1# CA証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    2cp pki/ca.crt /etc/openvpn/
    3# CA秘密鍵は以降のサーバ証明書・秘密鍵作成時、クライアント証明書・秘密鍵作成時のみ使用するため、コピー不要
  • サーバ証明書と秘密鍵作成

    1./easyrsa build-server-full server nopass
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    1# サーバ証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    2cp pki/issued/server.crt /etc/openvpn/
    3# サーバ秘密鍵をOpenVPN設定ファイル格納ディレクトリへコピー
    4cp pki/private/server.key /etc/openvpn/
  • DH(Diffie Hellman)パラメータ作成

    1# DHパラメータ作成
    2./easyrsa gen-dh
    3# DHパラメータをOpenVPN設定ファイル格納ディレクトリへコピー
    4cp pki/dh.pem /etc/openvpn/
  • 証明書廃止リスト作成
    証明書廃止リストは、実際にクライアント証明書を
    作成してから廃止を行わないと作成できないので、
    ダミーのクライアント証明書を一旦、作成と廃止することにより、
    証明書廃止リストを作成する

    1# ダミーのクライアント証明書作成
    2./easyrsa build-client-full dmy nopass
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    1# ダミーのクライアント証明書廃止
    2./easyrsa revoke dmy
    下記内容を入力
    Continue with revocation:yes
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    1# 証明書廃止リストを作成
    2./easyrsa gen-crl
    下記内容を入力
    Enter pass phrase for /etc/openvpn/easyrsa3/pki/private/ca.key:CA秘密鍵のパスワードを入力
    
    1# 証明書廃止リストをOpenVPN設定ファイル格納ディレクトリへコピー
    2cp pki/crl.pem /etc/openvpn/
    3# 証明書廃止リストへ参照権限付加
    4chmod o+r /etc/openvpn/crl.pem
  • TLS認証鍵作成

    1# TLS認証鍵作成
    2openvpn --genkey --secret /etc/openvpn/ta.key

IT単語覚書

  • HTTP
    HTMLなどのコンテンツデータをサーバ・クライアント間でやり取りするプロトコルのこと。
  • HTTPS
    HTTPのURIスキームの1つ。
    厳密にはプロトコルではなく、SSL/TLSプロトコルによって提供されるセキュアなHTTP通信。
    別名はHTTP Over SSL/TLSという。
  • SSL/TLS
    暗号化を提供するプロトコル。
    SSLの方が良く聞くが、SSLはTLSの旧名称。
    通信内容の暗号化と通信相手の証明を行う。
    HTTP専用ではなく、様々なアプリケーション層のプロトコルに利用でき、
    HTTPS(HTTP Over SSL/TLS)だけではなく、
    FTPS(FTP over SSL/TLS)、POP over SSL/TLS、IMAP over SSL/TLS、SMTP over SSL/TLSなどがある。
  • URIスキーム
    一定の書式によってリソースを指し示す識別子。
    URLの考え方を拡張したもの。
    httpやhttpsやftpなどのスキームで始まり、
    コロン(:)による区切りの後にスキームごとに定義された書式によってリソースを示す。

【FireFox】【Poster】リクエスト送信テスト

FireFoxのPosterと呼ばれるアドオンを利用し、
リクエスト送信のテストをしてみました。

  • サーブレット
    サーブレットはTestParamプロジェクトとして定義しておきます。
    TestServletはTestというサーブレットマッピング名として定義しておきます。

    1public class TestServlet extends HttpServlet {
    2    private static final long serialVersionUID = 1L;
    3    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    4 
    5        // リクエストの設定
    6        request.setCharacterEncoding("UTF-8");
    7 
    8        // ヘッダ部の取得
    9        StringBuffer head = new StringBuffer();
    10        Enumeration<String> headernames = request.getHeaderNames();
    11        while (headernames.hasMoreElements()) {
    12            String name = headernames.nextElement();
    13            Enumeration<String> headervals = request.getHeaders(name);
    14            while (headervals.hasMoreElements()) {
    15                String val = headervals.nextElement();
    16                head.append(name);
    17                head.append(":");
    18                head.append(val);
    19                head.append("\n");
    20        }
    21 
    22        // ボディー部の取得
    23        // メモ:Tomcatではrequest.getParameterとgetReaderが同時に使えない。
    24        BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
    25        String body = bufferReaderBody.readLine();
    26 
    27        // レスポンスの設定
    28        response.setCharacterEncoding("UTF-8");
    29        response.setContentType("text/hmtl");
    30        // response.setContentType("application/json");
    31 
    32        // ヘッダ部とボディー部の出力
    33        PrintWriter out = response.getWriter();
    34        out.println(head.toString());
    35        out.println(body);
    36    }
    37}
  • Poster
    Request-URL:http://localhost:8080/TestJson/Test
    Parametersタブ:Nameにtest、Valueにあいうえおを設定し、
    Add/Changeボタンを押下する。
    Content to Sendタブ:Body from Parametersボタンを押下する。
    POSTボタンを押下する。

    サーブレットがJSONの読み取りに対応していれば、
    ParametersタブのValueに以下を指定すると、JSONをリクエストで飛ばしたことになる。
    {“name”: “John Smith”, “age”: 33}