2014-08-20|1366阅|作者:路易斯陈凯瑞|举报 摘要:之前思考过系统接入的多编码问题,虽然通过web.xml的配置解决了问题,但是显然不是一个很优雅的解决方案。
回过头来重新看一下问题,矛盾出现在接入方通过request parameter post一个charset参数过来,期望我们通过这个参数来做响应的处理;
事实是当我们读到这
之前思考过系统接入的多编码问题,虽然通过web.xml的配置解决了问题,但是显然不是一个很优雅的解决方案。
回过头来重新看一下问题,矛盾出现在接入方通过request parameter post一个charset参数过来,期望我们通过这个参数来做响应的处理;
事实是当我们读到这个参数(即调用request.getParameter)的时候,输入流已经被转码为系统默认编码,而通过参数传递的中文已经变成乱码了,
所以我们只要在其他地方设置一个参数,比如http head,由于head和body是不同的输入流,所以读取这个参数的时候不会引发参数被转码。
接入方代码:
HttpClient client = new HttpClient();
List<Header> headers = new ArrayList<Header>();
headers.add(new Header("charset", charsetName));
client.getHostConfiguration().getParams().setParameter(
"http.default-headers", headers);
Filter的代码:
String requsetCharset = request.getHeader("charset");
if(StringUtils.isBlank(requsetCharset)){
super.setEncoding(encoding);
super.setForceEncoding(forceEncoding);
super.doFilterInternal(request, response, filterChain);
}else{
request.setCharacterEncoding(requsetCharset);
response.setCharacterEncoding(requsetCharset);
filterChain.doFilter(request, response);
}
这种做法虽然增加了商户端的工作量,但是同时也增加了他们的灵活性,可以灵活的选择编码而不需要每次改动都通知服务端。