AjaxButtonとかをShift_JISのページで利用すると文字化けする件について
Wicket-jaのメーリングリストで報告した件ですが、こちらにも載せておきます。
http://lists.sourceforge.jp/mailman/archives/wicket-ja-user/2008-April/000072.html
Wicketにて、
getRequestCycleSettings().setResponseRequestEncoding("Shift_JIS");
でページのエンコーディングをUTF-8以外にして、AjaxButtonをaddしてSubmitさせると、送信されるフォームの内容が
文字化けします。
原因は、AjaxButtonがsubmit時に実行するJavaScriptの中で、
encodeURIComponent()にてPOSTデータはページエンコーディングに
かかわらずutf-8になってしまうためです。
ブラウザからはutf-8でリクエストが送信され、Wicket側はetResponseRequestEncoding()で設定された文字コードでフォームデータをデコードするため、ここで文字化けが発生します。
id:t_yanoが本家にバグ報告をしてくれています。
https://issues.apache.org/jira/browse/WICKET-1569
なので、そのうち直ると思いますが、現時点では、以下のようなFilterをWicketFilterの前にかましてやれば対処は可能です。
(packageは適当になおしてください)
package com.yuroyoro.wicket;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class AjaxEncodingFilter implements Filter {
/* (非 Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
/* (非 Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
String ajaxHeader = httpServletRequest.getHeader("Wicket-Ajax");
if (ajaxHeader != null && ajaxHeader.length() > 0 && ajaxHeader.equalsIgnoreCase("true"))
{
httpServletRequest.setCharacterEncoding("utf-8");
request = new HttpServletRequestWrapper(httpServletRequest){
/* (非 Javadoc)
* @see javax.servlet.ServletRequestWrapper#setCharacterEncoding(java.lang.String)
*/
@Override
public void setCharacterEncoding(String enc)
throws UnsupportedEncodingException {
// 何もしない
}
};
}
chain.doFilter(request, response);
}
/* (非 Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig filterConfig) throws ServletException {
}
}