anyway, I found that Ajax request are all encoded as UTF-8 no matter what encoding used in the web page. And Tomcat always re-encode ajax request to ISO8859-1 (don't known why...) so I need to recover encoding back to UTF-8 manually for all request parameters:
new String(parameter.getBytes("ISO8859-1"), "UTF-8");
To solve this gloably I use a ServletFilter:
public class FixAjaxEncodingFilter extends Filter {
private static final String WICKET_AJAX = "Wicket-Ajax";
@Override
protected void doFilter(ServletRequest request,
ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
//Skip some casting...
String wicketAjaxHeader = request.getHeader(WICKET_AJAX);
if (wicketAjaxHeader == null || wicketAjaxHeader.trim().length() == 0) {
filterChain.doFilter(request, response);
} else {
filterChain.doFilter(new AjaxEncodingFixHttpServletRequest(
request), response);
}
}
/**
* The request wrapper to fix ajax request encoding for encoding other than
* UTF-8
*/
private static class AjaxEncodingFixHttpServletRequest extends
HttpServletRequestWrapper {
private final HashMap<String, Object> encodedParameterMap;
@SuppressWarnings("unchecked")
public AjaxEncodingFixHttpServletRequest(
final HttpServletRequest orgHttpServletRequest) {
super(orgHttpServletRequest);
encodedParameterMap = new HashMap<String, Object>();
final Map<String, Object> orgParameterMap = getRequest()
.getParameterMap();
for ( Map.Entry <String, Object> entry : orgParameterMap.entrySet()) {
if (entry.getValue() == null) {
encodedParameterMap.put(entry.getKey(), entry.getValue());
continue;
}
try {
if (entry.getValue().getClass().isArray()) {
String[] values = (String[]) entry.getValue();
String[] newValues = new String[ values.length];
for (int i = 0; i < values.length; i++) {
if (values[i] == null) {
continue;
}
newValues[i] = new String(values[i]
.getBytes("ISO8859-1"), "UTF-8");
}
encodedParameterMap.put (entry.getKey(), newValues);
} else {
String value = (String) entry.getValue();
encodedParameterMap.put(entry.getKey(), new String(
value.getBytes("ISO8859-1"), "UTF-8"));
}
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("unexpected", e);
}
}
}
@Override
public Map getParameterMap() {
return encodedParameterMap;
}
@Override
public String getParameter(String name) {
Object object = encodedParameterMap.get(name);
if (object == null) return null;
if (object.getClass().isArray()) {
String[] values = (String[]) object;
if ( values.length == 0) return null;
return values[0];
} else {
return object.toString();
}
}
@Override
public String[] getParameterValues(String name) {
Object object = encodedParameterMap.get(name);
if (object == null) return null;
if (object.getClass().isArray()) {
return (String[]) object;
} else {
return new String[] { object.toString() };
}
}
}
}
If request is Wicket Ajax, then wrap original HttpSerlvetRequest and re-encode all request parameters. This filter also solve "get" problems such as AjaxEditableLabel, which originally requiring additional seeting on URIEncoding .
Don't know if there is any Native Wicket way to solve this ?
--
Ingram Chen
Java [EMAIL PROTECTED]
Institue of BioMedical Sciences Academia Sinica Taiwan
blog: http://www.javaworld.com.tw/roller/page/ingramchen
------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________ Wicket-user mailing list Wicket-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wicket-user