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

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

# Form1.cs
namespace WindowsFormsApplication1
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.Navigate("http://test1/");
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // クッキーを取得する。
            string cookieStr = webBrowser1.Document.Cookie;

            // WebClientを生成する。
            WebClient wc = new WebClient();
            Encoding enc = Encoding.UTF8;

            // WebClientのヘッダ設定を行う。
            // wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows XP)");
            wc.Headers[HttpRequestHeader.Cookie] = cookieStr;

            // WebClientでクッキーを引き継いで他のサイトにアクセスする。
            byte[] result = wc.DownloadData("http://test2/");
            string html = enc.GetString(result);
            Console.WriteLine(html);

            // クッキーの中身を確認する。
            // string[] cookieAry = cookieStr.Split(';');
            // foreach (string str in cookieAry)
            // {
            //    MessageBox.Show(str);
            // }
        }
    }
}

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

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

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

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

# Form1.Designer.cs
namespace WindowsFormsApplication1
    partial class Form1
    {
        private void InitializeComponent()
        {
            this.webBrowser1.Location = new System.Drawing.Point(52, 193);
            this.webBrowser1.MinimumSize = new System.Drawing.Size(20, 20);
            this.webBrowser1.Name = "webBrowser1"
            this.webBrowser1.Size = new System.Drawing.Size(508, 213);
            this.webBrowser1.TabIndex = 2;
            this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
        }
    }
}
# Form1.cs
namespace WindowsFormsApplication1
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            // ここにページ読み込み完了後の処理を記載する。
        }
    }
}

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

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

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

var fso = new ActiveXObject("Scripting.FileSystemObject");
var files = fso.GetFolder("D:/replaceBefore").Files;
var e = new Enumerator(files);
// ディレクトリ内の全てのファイル分繰り返す。
for ( ; !e.atEnd(); e.moveNext()) {
    var file = e.item();
    var fileFullPathBefore = "D:/replaceBefore/" + file.Name;
    var fileFullPathAfter  = "D:/replaceAfter/" + file.Name;
    WScript.Echo(fileFullPathBefore + "を処理します。");

    // 入力ファイルの設定
    // Typeの設定値
    // 1:バイナリを表す。
    // 2:既定値。charsetで指定した文字セットで文字列を表す。
    var sr = new ActiveXObject("ADODB.Stream");
    sr.Type = 2;
    sr.charset = "utf-8";
    sr.Open();
    sr.LoadFromFile(fileFullPathBefore);

    // 出力ファイルの設定
    var sw = new ActiveXObject("ADODB.Stream");
    sw.Type = 2;
    sw.charset = "utf-8";
    sw.Open();

    // 入力ファイルの読込み
    // 入力ファイルがEOSになるまで繰り返す。
    while (!sr.EOS) {

        // ReadTextの第1引数
        // -1:既定値。EOSマーカーに達するまですべてのバイトをストリームから読み取る。
        // -2:改行までの行をストリームから読み取る。改行はLineSeparatorの設定値依存。
        var temp = sr.ReadText(-2);

        // 置換文字列検索用
        // RegExpの第2引数に'g'を指定すると全置換になる。
//        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}");
//        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');
//        temp = temp.replace(reg, "");

        // 出力ファイルの書込み
        // WriteTextの第2引数
        // ActiveXObjectのTypeが文字列(2)の場合に利用する。
        // 0:既定値。文字列を書き込む。
        // 1:文字列+改行を書き込む
        // 末尾の1文字を取得する。
        var lastWord = temp.slice(-1);
        // 末尾がダブルクォートである場合
        if (lastWord == "\"") {
//            WScript.Echo("ダブルクォート");
            // 文字列+改行を書き込む。
            sw.WriteText(temp, 1);
        // 末尾がダブルクォート以外である場合
        } else {
//            WScript.Echo("違う");
            // 文字列を書き込む。
            sw.WriteText(temp, 0);
        }
    }

    // 書き込みの文字コードがUTF-8の場合、BOMが付与されるため、除去する。
    // 書き込んだオブジェクトのポジションをゼロに戻し、
    // バイナリモードを指定した上で、ポジションを3byte分ずらし、再書き込みする。
    // この処理順序は変更不可。
    if (sw.charset == "utf-8") {
        sw.Position = 0;
        sw.Type = 1;
        sw.Position = 3;
        var textBinary = sw.Read();
        sw.Close();
        sw.Type = 1;
        sw.Open();
        sw.Write(textBinary);
    }

    sr.Close();
    sr = null;

    // 出力ファイルの保存
    // SaveToFileの第2引数
    // 1:既定値。ファイルがない場合、新規作成する。ファイルがある場合、上書きしない。
    // 2:ファイルがない場合、新規作成する。ファイルがある場合、上書きする。
    sw.SaveToFile(fileFullPathAfter, 2);
    sw.Close();
    sw = null;
}
fso = null;

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

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

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

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

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

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

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

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

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

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

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

    # クライアント用の証明書作成
    cd /etc/openvpn/easyrsa3/
    ./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やパスワード無しでログインする場合、こっちを選択。

    # クライアント用の証明書作成
    cd /etc/openvpn/easyrsa3/
    ./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と秘密鍵のフォーマットが異なり、接続できないことがある。
    そこで以下のコマンドで秘密鍵を変換する。

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

【VPNサーバ】OpenVPN設定

  • OpenVPN設定

    # OpenVPN設定ファイルをOpenVPN設定ファイル格納ディレクトリへコピー
    cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
    # OpenVPN設定ファイルを編集
    vi /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起動時実行スクリプト作成

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

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

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

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

【VPNサーバ】OpenVPN導入

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

  • OpenVPN導入

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

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

    ./easyrsa build-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
    
    # CA証明書をOpenVPN設定ファイル格納ディレクトリへコピー
    cp pki/ca.crt /etc/openvpn/
    # CA秘密鍵は以降のサーバ証明書・秘密鍵作成時、クライアント証明書・秘密鍵作成時のみ使用するため、コピー不要
    
  • サーバ証明書と秘密鍵作成

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

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

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

    # TLS認証鍵作成
    openvpn --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というサーブレットマッピング名として定義しておきます。

    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            // リクエストの設定
            request.setCharacterEncoding("UTF-8");
    
            // ヘッダ部の取得
            StringBuffer head = new StringBuffer();
            Enumeration<String> headernames = request.getHeaderNames();
            while (headernames.hasMoreElements()) {
                String name = headernames.nextElement();
                Enumeration<String> headervals = request.getHeaders(name);
                while (headervals.hasMoreElements()) {
                    String val = headervals.nextElement();
                    head.append(name);
                    head.append(":");
                    head.append(val);
                    head.append("\n");
            }
    
            // ボディー部の取得
            // メモ:Tomcatではrequest.getParameterとgetReaderが同時に使えない。
            BufferedReader bufferReaderBody = new BufferedReader(request.getReader());
            String body = bufferReaderBody.readLine();
    
            // レスポンスの設定
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/hmtl");
            // response.setContentType("application/json");
    
            // ヘッダ部とボディー部の出力
            PrintWriter out = response.getWriter();
            out.println(head.toString());
            out.println(body);
        }
    }
    
  • 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}