サーブレットの中で下のコードのように 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エンコードしないといけないんですね。
勉強不足でした…