Servlet2.3の仕様バグで、HTTP-REQUESTのボディ部の文字コードがUS-ASCII決め打ちなので、フィルタで埋め込んでやる必要があります。
尚、ヘッダ部はここで文字コードを埋め込んでやってもエンコードされないので、日本語の文字列をGET( http://foo.com/request?name=圃下太郎 )で受け取る場合には、別途ヘッダをエンコードしてやる必要があります。(だから画面からGETで日本語を送らないというのは賢明な判断)
public class CharsetEncodingFilter
implements Filter {
/** jakarta-commons-logging */
private static Log logger = LogFactory.getLog(CharsetEncodingFilter.class);
/** このサーブレットアプリケーションの文字コードセット名 */
private String charset = null;
/**
* デフォルトコンストラクタ
*/
public CharsetEncodingFilter() {
super();
}
/*
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
logger.info("CharsetEncodeFilter終了します。文字コード:" + charset);
}
/**
* REQUESTに文字コード名を設定します。
* @param req リクエスト
* @param res レスポンス
* @param chain FilterChain
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(
ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding(charset);
chain.doFilter(req, res);
}
/**
* web.xmlから文字コードセット名を受け取ります.
* <pre>
* web.xmlから、文字コードセット名を受け取ります。
* 設定されていない場合は、JISAutoDetectになります。
* </pre>
* @param filterconfig フィルタ設定情報
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig filterconfig) throws ServletException {
charset = filterconfig.getInitParameter("charset");
if (charset == null) {
charset = "JISAutoDetect";
}
logger.info("CharsetEncodeFilter起動します。。文字コード:" + charset);
}
}
<!-- Filter -->
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.foo.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>Shift_JIS</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
※web.xmlの記述順序を参照