(weird, I sent mail two days ago, but it is rejected. I send again....)

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

Reply via email to