[Java] Cookie に日本語の値をそのまま保存するとエラーが出る

サーブレットの中で下のコードのように Cookie日本語の値を格納しようとしたら「HTTPステータス500 – Control character in cookie value or attribute.」という画面が出ました。
内部的には「java.lang.IllegalArgumentException: Control character in cookie value or attribute.」という例外が発生しています。

    Cookie c = new Cookie("name", "たろう");
    response.addCookie(c);
    

    Cookie の値として使用できる文字には制限があるようで、URL で使用できる文字列であればいいようです。
    ということで、値を格納する前に URLEncoder.encode() メソッドを使って URL エンコードしてあげます。

    Cookie c = new Cookie("name", URLEncoder.encode("たろう", "UTF-8"));
    response.addCookie(c);
    

    これで上記エラーは出なくなりました。
    ただし、この値を取り出して使用する際には、逆に URLDecoder.decode() を使って逆変換をしておかないと、「%E3%81%9F%E3%82%8D%E3%81%86」のような読めない文字列が出てきてしまいます。

    // name には Cookie から取り出した値が格納されているとする
    name = URLDecoder.decode(name, "UTF-8");
    

    PHPでは setcookie() で勝手にURLエンコード/デコードしてくれますが、Javaでは自分でURLエンコードしないといけないんですね。
    勉強不足でした…


    Pocket
    Bookmark this on Yahoo Bookmark

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>