用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字

路易斯陈凯瑞    -  云代码空间

—— 天行健,君子以自强不息。地势坤,君子以厚德载物

在系统接入支持多种编码(2)

2014-08-20|1359阅||

摘要:之前思考过系统接入的多编码问题,虽然通过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);
            }
这种做法虽然增加了商户端的工作量,但是同时也增加了他们的灵活性,可以灵活的选择编码而不需要每次改动都通知服务端。
顶 0踩 0收藏
文章评论
    发表评论

    个人资料

    • 昵称: 路易斯陈凯瑞
    • 等级: 中级程序员
    • 积分: 236
    • 代码: 4 个
    • 文章: 3 篇
    • 随想: 0 条
    • 访问: 5 次
    • 关注

    最新提问

      站长推荐