( ꒪⌓꒪) ゆるよろ日記

( ゚∀゚)o彡°オパーイ!オパーイ! ( ;゚皿゚)ノシΣ フィンギィィーーッ!!!

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 {

	}

}