`

由URLDecoder.decode(reqBody, "utf-8");引发的bug

    博客分类:
  • JAVA
阅读更多

     最近在跟Asp.net端调接口,产品接口里面有个上传产品头像的功能。Asp.net端需要把上传的图片流重新用Apache Base64编码,服务端使用base64解码成byte输入流上传到Windows azure云端就可以了。在今天之前小檀的接口都是正确的,今天重新再走了一下流程发现图片上传到云端后打不开。小檀走了一下本地httpclient请求模拟了一下,无果。

   作为一个程序员,bug太多他不会哭,当他调了一上午的代码发现罪魁祸首是一个空格,他就想泪奔了。废话不多说,现在开始说正文。

    在公司崔哥的帮助下,发现原来是这行代码出了问题。代码如下:

   

public static JSONObject buffer(HttpServletRequest request) {
        JSONObject checkInfo = null;
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(),"utf-8"));
            String line = null;
            StringBuilder sb = new StringBuilder();
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            // 将资料解码
            String reqBody = sb.toString();
           //reqBody = URLDecoder.decode(reqBody, "utf-8");
            checkInfo = JSONObject.parseObject(reqBody);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return checkInfo;
    }

 

    对的,就是这行被注释掉的代码。随便百度一下就知道,通过urlencode转码后的字符串,需要通过UrlDecode进行解码。这个必须一致,所以秒懂了!所以如果想保留这行代码,那么客户端http request body必须要使用UrlEncoder转码。反之都不要!下面分享一下我的httpclient4.x post的封装代码:

 

    // 发送post请求,返回结果response
     //I.使用StringEntity组织参数流,虽然不推荐了,但是很好用

 

  public static HttpResponse getResponseByPostWithStringEntity(String postUrl, Map<String, Object> paramsMap) {
        HttpResponse httpResponse = null;
        StringEntity entity = null;
        try {
            if (paramsMap != null && StringUtils.isNotBlank(postUrl)) {
                entity = new StringEntity(JSON.toJSONString(paramsMap),MIME_TYPE, CONTENT_CHARSET);
                HttpPost httpPost = new HttpPost(postUrl);
                // 为HttpPost设置实体数据
                httpPost.setEntity(entity);
                httpResponse = httpclient.execute(httpPost);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return httpResponse;
    }

 

     //发送post请求,返回结果response
     //II. urlEncode httpclient目前版本极力推荐(备注:客户端重新编码后,服务器端必须解码)

 

 public static HttpResponse getResponseByPostWithUrlEncoded(String postUrl, Map<String, Object> paramsMap) {

        HttpResponse httpResponse = null;
        UrlEncodedFormEntity entity = null;// 参数流

        List<NameValuePair> nameValuePairArrayList = new ArrayList<NameValuePair>();
        try {
            if (paramsMap != null && !paramsMap.isEmpty() && StringUtils.isNotBlank(postUrl)) {
                // 将传过来的参数填充到List<NameValuePair>中
                for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
                    nameValuePairArrayList.add(new BasicNameValuePair(entry.getKey(), entry.getValue() != null ? entry.getValue()
                            .toString() : ""));
                }
                entity = new UrlEncodedFormEntity(nameValuePairArrayList, CONTENT_CHARSET);
                HttpPost httpPost = new HttpPost(postUrl);
                // 为HttpPost设置实体数据
                httpPost.setEntity(entity);
                httpResponse = httpclient.execute(httpPost);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return httpResponse;

    }

   从这个错误深刻发现,沟通应该到细节,要清楚自己的程序里面每行代码的作用和意义!

   

   

分享到:
评论

相关推荐

    JS的encodeURI和java的URLDecoder.decode使用介绍

    如果不想在url中看到有明文,比如http://localhost:8080/template_1/login.action?user=张三 可以使用js的encodeURI的URLDecoder.decode一起使用一起来把url加密下 (1)JS在页面上把数据var val = encodeURI...

    JS的encodeURI和java的URLDecoder.decode使用介绍.docx

    JS的encodeURI和java的URLDecoder.decode使用介绍.docx

    java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法

    主要给大家介绍了关于java中URLEncoder.encode与URLDecoder.decode处理url特殊参数的方法,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    多文件上传例子(解决中文乱码)

    多文件上传例子,彻底解决中文乱码问题了。...4、适当的时候,在jsp里用java.net.URLDecoder.decode(request.getParameter("str"),"UTF-8")。 5、最容易忽略的是使用"":value="&lt;%=paraFiles%&gt;",一定要有引号。

    google translate api 0.95

    使用非常简单 ---------------------------------------- HttpServletRequest request = ... msg = Translate.execute(URLDecoder.decode(q, "utf-8"), getLan(sourceLan), getLan(targetLan)); return SUCCESS;

    Session.docx

    可以写任意java代码 ...Cookie[]cookies=request.getCookies(); Stringusername=""; if(cookies!=null){ for(Cookiec:cookies){ if("remname".equals(c.getName...username=URLDecoder.decode(username,"utf-8"); } } } %&gt;

    jsp中URL传递中文参数的处理方法

    在页面的url中使用encodeURI(encodeURI(中文)),对中文进行编码,并在服务器的java程序中使用URLDecoder.decode(中文, “UTF-8”)进行解码即可; 如果url中需要传递+、#、?等特殊符号,可以使用encodeURIComponent...

    sax解析util

    str = URLDecoder.decode(str, "utf-8"); File conf = new File(str); SAXReader reader = new SAXReader(); Document document = reader.read(conf); Element root = document.getRootElement(); ...

    Android UTF-8转码实例详解

    Android UTF-8转码实例详解 在项目中可能会遇到url中有中文的情况,这个时候我们可能需要对url进行编码 mport java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; ...

    用C++来实现UrlEncode

    本文用C++来实现UrlEncode!

    Ajax传递中文参数到后台乱码的有效解决方法

    extraParams: {q:function(){return encodeURI(encodeURI($(‘#keyword’).val()))}} 这里同样也要解码两次 代码如下: String key = URLDecoder.decode(URLDecoder.decode(q,”UTF-8″),”tuf-8″);

    web程序开发中的URL乱码解决方案

    在服务器端/后台/后台程序中通过指定的编码方式将十六进制的数据还原:String afterConvertChinese=URLDecoder.decode("从页面上获取的中文信息","编码方式(该处的编 码方式必须和页面中的一样)");

    RSA,JS加密java解密

    很简单,一看就懂,用不明白可以留言,看到必回!如果加密中文js里加密之前encodeURIComponent编码一下,java用java.net.URLDecoder.decode(outputStr, "UTF-8");解码

    网址编码解码,jQuery版Url.encode,Url.decode,Url.parse.rar

    网址编码解码,jQuery版Url.encode,Url.decode,Url.parse,一个来自jQuery的URL Decoder解码、编码插件,为你的URL安全定义一道安全防线,示例文件本身就是一个值得学习的实例,自带的示例将告诉你如何使用这款URL...

    JQuery 传送中文乱码问题的简单解决办法

    一、客户端先进行编码,服务端再解码。...String name = URLDecoder.decode(names, "UTF-8"); 注意:必须用encodeURIComponent编码两次。 二、在 tomcat 服务端指定编码格式为 UTF-8 利用方式一虽然可以解决

    很经典的登录回选。

    URLEncoder.encode(URLDecoder.decode(url,"iso-8859-1"), "iso-8859-1"); session.setAttribute("redirectUrl",url); } else{ session.setAttribute("redirectUrl", request.getRequestURL() .toString());...

    url中文字符解码

    通过URLEncoder.encode加密地址栏url上得中文字符, 并可通过java.net.URLDecoder.decode(str, charset)解密中文

    jsp页面间传中文参数示例(页面传参数编码)

    解码: 代码如下:java.net.URLDecoder.decode((String)request.getParameter(“tcontent”), “UTF-8”); 例a.jsp源代码 代码如下:&lt;&#37;@ page contentType=”text/html; charset=gb2312″ language=”java” ...

    jsp中页面间传汉字参数转码的方法

    解码:java.net.URLDecoder.decode((String)request.getParameter(“tcontent”), “UTF-8”); 例 a.jsp源代码 代码如下:&lt;&#37;@ page contentType=”text/html; charset=gb2312″ language=”java” import=”...

Global site tag (gtag.js) - Google Analytics