`

在实际使用中,urlEncoding的处理

 
阅读更多
问题:实际使用中有个功能需要参数列表以postForm表单的形式给用户(后台通知httppost),还需要将参数列表GETFrom表单的形式给用户(前台跳转httpGET)。其中form参数中有个参数是RSA加密的结果,有特殊字符(比如说“=”号),需要urlEncoding进行转码。

转码后,客户收到请求,前台通知成功验签成功,后台通知验签失败。


问题查找:
写了个callbackAction回显代码
String body= JSON.toJSONString(getRequest().getParameterMap());
getResponse.setContentType("text/html;charset=utf-8");
Writer writer=getResponse.getWriter();
writer.write("QeryString:"+getRequest().getQueryString()+"\n");
writer.write("Body:"+body);
writer.flush();
wirter.close();


参数mac值为: abc==,urlEncode编码后abc%3d%3d。
1、前台跳转时,自己拼接路径callbackurl=url?name1=value1&name2=value2
,跳转到自己的系统的页面,在页面停留几秒,然后跳转到商户的提供的地址上。

<script type="text/javascript">
var url=${callbackurl};
function callBack(){
   if(url && url!=null && ""!=url){  
      window.location.href=url;
   } else {
      closeWebPage();
   }
}
</script>



GET请求测试:浏览器输入

http://127.0.0.1:8080/merchant-mock/callback.do?mac=abc%3d%3d

结果:页面上显示
QueryString:mac=abc%3d%3d
Body:["mac":["abc=="]]

说明:GET请求里面参数进行urlEnCode编码后会自动会被Decode回来。

但是为什么POST参数,解析后验签失败呢?带着问题找答案

2、代码中POST请求检查
代码中,将参数value进行urlEncode编码放入map中,然后通过apache的httpClient进行POST请求。
mac=URLEncoder.encode(mac,"UTF-8");
params.put("mac",mac);

httpClient hc=new DefaultHttpClient();
httpPost httpPost=new httpPost(httpUrl);
UrlEncodeFormEntity entity=new UrlEncodeFormEntity(params,encoding);
httpPost.setEntity(entity);
...
HttpResponse response=hc.execute(httpPost);

打开httpClient的源码org.apache.http.client.entity.UrlEncodeFormEntity
public UrlEncodeFormEntity(final List<? extends NameValuePair> parameters,final String charset){

super(URLEncodedUtils.format(parameters,charset,ContentType.create(URLEncodedUtils.ContentType,charset)))
}

httpClient源码类org.apache.http.client.utils.URLEncodeUtils

public Class URLEncodeUtils{
public static final String CONTENT_TYPE="application/x-www-form-urlencoded";
public static final char QP_SEP_A='&';
public static final String NAME_VALUE_SEPARATOR="=";
public static final int RADIX =16;
...

public static String format(List parameters,String charset){
   return format(parameters,QP_SEP_A,charset)
}

public static String format(List parameters,char separator,String charset){
final StringBuilder result=new StringBuilder();
for(NameValuePair parameter:parameters){
   final String encodedName=encodeFormFields(parameter.getName(),charset);
   final String encodedValue=encodeFormFields(parameter.getValue(),charset);
   if(result.length()>0){
      result.append(separator);
   }
   result.append(encodedName);
   if(encodedValue!=null){ 
      result.append(NAME_VALUE_SEPARATOR);
      result.append(encodedValue);
   }
}
return result.toString();
}


//encodeFormFormFields进行了urlEncode编码,调用urlEncode方法
public static String urlEncode(String content,Charset charset,BitSet safechars,boolean blankAsPlus){

if(content== null){
  return null;
}
StringBuilder buf=new StringBuilder();
ByteBuffer bb=charset.encode(content);
while(bb.hasRemaining()){
   final int b = bb.get() & oxff;
   if(safechars.get(b)){  
      buf.append((char) b);
   }else if(blankAsPlus && b ==' '){
      buf.append('+');
   }else{
      buf.append("%");
      char hex1=Character.toUpperCase(Character.forDigist((b>>4)&0xf,RADIX));
      char hex2=Character.toUpperCase(Character.forDigist(b & 0xf,RADIX));
      buf.append(hex1);
      buf.append(hex2);
   }
}
return buf.toString();

}


结果:我们发现对参数做了两次urlEncoding,httpClient的UrlEncodeFormEntity自己自己拼装name1=value1&name2=vlaue2的时候已经对name和value都进行了urlEncode。使用这种方式的时候不需要主动进行urlEncoding。


分享到:
评论

相关推荐

    asp下实现UrlEncoding转换编码的代码

    在ASP(Active Server Pages)中,UrlEncoding是一个关键的编程技术,主要用于处理URL中的特殊字符。这是因为URL(统一资源定位符)中某些字符在传输过程中可能会引起解析问题,比如空格通常会被转换为加号(+)或者...

    Jsp和Servlet中文乱码问题

    1. **统一编码**:在整个项目中使用统一的字符编码,如UTF-8,这是目前最通用且支持多语言的编码方式。 2. **检查数据库连接**:确保数据库连接也使用相同的编码,避免数据在存储和检索过程中的乱码问题。 3. **...

    ajax和java 做分页技术

    在Web开发中,分页技术是一项非常重要的功能,它能够帮助用户更有效地浏览大量数据,而无需一...在实际开发中,还需要考虑错误处理、性能优化以及前后端数据格式的统一等问题,以实现一个完整的、健壮的分页解决方案。

    C++转UTF8编码.txt

    在IT领域,尤其是在软件开发与数据处理中,字符编码转换是一项基本且重要的技术。本文将深入探讨如何使用C++将普通字符串转换为UTF8编码格式,这一过程涉及到的知识点包括但不限于:C++语言特性、字符串操作、编码...

    关于URL编码

    `Server.UrlEncode`和`Server.UrlDecode`与`HttpUtility`类中的方法功能相同,但它们更易于在服务器端脚本中使用。 在实际应用中,URL编码通常用于以下场景: 1. 表单提交:当用户通过HTML表单提交数据时,如果数据...

    详解XMLHTTP控件的应用

    ### 详解XMLHTTP控件的应用 #### XMLHTTP控件简介 ...掌握它的使用方法不仅能够提高开发效率,还能帮助开发者解决实际工作中遇到的各种问题。希望这篇文章能帮助大家更好地理解和应用XMLHTTP控件。

    URL编解码程序(自己写)

    在实际的网络爬虫项目中,正确处理URL编码是非常关键的,因为错误的编码可能导致链接无法正确解析,进而影响爬虫抓取网页内容的能力。 网络爬虫技术中,URL编解码的应用不仅仅局限于基础的编码与解码。它还可能涉及...

    js调用AJAX时Get和post的乱码解决方法

    在JavaScript中,AJAX(Asynchronous JavaScript and XML)是一种用于创建动态网页的技术,它...在实际开发中,还需要考虑各种浏览器的兼容性,以及可能存在的其他编码问题,如文件上传、表单提交等场景下的编码处理。

    详解okhttp3 请求头不能为中文的坑

    标题和描述中提到的知识点是关于okhttp3(OkHttp 3)这个网络请求库在处理请求头时的一个问题:请求头的键(key)和值(value)不能包含中文字符,否则会抛出异常,导致请求失败。这个现象通常被称为“坑”。文章...

    Go(golang)ECB模式的加密和填充。.zip

    然而,实际应用中,由于ECB模式的局限性,通常推荐使用更安全的模式,如CBC(密码块链接)或CFB(密文反馈)。这些模式通过使用前一块的密文来加密当前块,增加了安全性并消除了ECB的重复模式问题。在编写实际的加密...

    关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法

    在IT行业中,尤其是在Web开发领域,编码问题是一个常见的挑战,特别是在处理多语言和跨平台通信时。本问题涉及的是一个具体的情景,即UTF-8编码的客户端通过AJAX方式从GB2312编码的服务器端获取数据时遇到的乱码问题...

    AntiXssLibrary_HtmlSanitizationLibrary.zip

    这两个库在实际开发中常被结合使用,先通过HtmlSanitizationLibrary清理输入的HTML,然后使用AntiXssLibrary进行进一步的编码和转义,以达到最大程度的安全性。 为了有效地利用这两个库,开发者需要了解它们的功能...

    go语言实现字符串base64编码的方法

    在计算机科学中,Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在电子邮件系统、HTML和XML文档中传输非ASCII字符...在实际开发中,根据具体需求选择合适的方法,可以确保代码的简洁性和效率。

    Javascript技术技巧大全(五)

    在实际应用中,JavaScript通常不直接与数据库交互,而是通过服务器端脚本(如PHP、Node.js等)处理数据库操作。然而,一些现代浏览器支持Web SQL或IndexedDB,它们是客户端存储和操作数据的API,可以用JavaScript...

    go语言base64加密解密的方法

    接下来,代码中使用base64.NewEncoding方法创建了一个自定义编码器(coder),然后定义了两个函数,分别是base64Encode和base64Decode。base64Encode函数接收一个字节切片作为输入,并返回base64编码后的字符串。...

    Web层改进II-用xmlhttp 无声息提交复杂表单

    为了解决这个问题,示例代码中使用了一个自定义的 `URLEncoding` 函数来进行字符串的UTF-8编码。这个函数逐个字符地遍历字符串,并将其转换为合适的格式。需要注意的是,这里使用的是VBScript来编写该函数,如果使用...

Global site tag (gtag.js) - Google Analytics