问题:实际使用中有个功能需要参数列表以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(Active Server Pages)中,UrlEncoding是一个关键的编程技术,主要用于处理URL中的特殊字符。这是因为URL(统一资源定位符)中某些字符在传输过程中可能会引起解析问题,比如空格通常会被转换为加号(+)或者...
1. **统一编码**:在整个项目中使用统一的字符编码,如UTF-8,这是目前最通用且支持多语言的编码方式。 2. **检查数据库连接**:确保数据库连接也使用相同的编码,避免数据在存储和检索过程中的乱码问题。 3. **...
在Web开发中,分页技术是一项非常重要的功能,它能够帮助用户更有效地浏览大量数据,而无需一...在实际开发中,还需要考虑错误处理、性能优化以及前后端数据格式的统一等问题,以实现一个完整的、健壮的分页解决方案。
在IT领域,尤其是在软件开发与数据处理中,字符编码转换是一项基本且重要的技术。本文将深入探讨如何使用C++将普通字符串转换为UTF8编码格式,这一过程涉及到的知识点包括但不限于:C++语言特性、字符串操作、编码...
`Server.UrlEncode`和`Server.UrlDecode`与`HttpUtility`类中的方法功能相同,但它们更易于在服务器端脚本中使用。 在实际应用中,URL编码通常用于以下场景: 1. 表单提交:当用户通过HTML表单提交数据时,如果数据...
### 详解XMLHTTP控件的应用 #### XMLHTTP控件简介 ...掌握它的使用方法不仅能够提高开发效率,还能帮助开发者解决实际工作中遇到的各种问题。希望这篇文章能帮助大家更好地理解和应用XMLHTTP控件。
在实际的网络爬虫项目中,正确处理URL编码是非常关键的,因为错误的编码可能导致链接无法正确解析,进而影响爬虫抓取网页内容的能力。 网络爬虫技术中,URL编解码的应用不仅仅局限于基础的编码与解码。它还可能涉及...
在JavaScript中,AJAX(Asynchronous JavaScript and XML)是一种用于创建动态网页的技术,它...在实际开发中,还需要考虑各种浏览器的兼容性,以及可能存在的其他编码问题,如文件上传、表单提交等场景下的编码处理。
标题和描述中提到的知识点是关于okhttp3(OkHttp 3)这个网络请求库在处理请求头时的一个问题:请求头的键(key)和值(value)不能包含中文字符,否则会抛出异常,导致请求失败。这个现象通常被称为“坑”。文章...
然而,实际应用中,由于ECB模式的局限性,通常推荐使用更安全的模式,如CBC(密码块链接)或CFB(密文反馈)。这些模式通过使用前一块的密文来加密当前块,增加了安全性并消除了ECB的重复模式问题。在编写实际的加密...
在IT行业中,尤其是在Web开发领域,编码问题是一个常见的挑战,特别是在处理多语言和跨平台通信时。本问题涉及的是一个具体的情景,即UTF-8编码的客户端通过AJAX方式从GB2312编码的服务器端获取数据时遇到的乱码问题...
这两个库在实际开发中常被结合使用,先通过HtmlSanitizationLibrary清理输入的HTML,然后使用AntiXssLibrary进行进一步的编码和转义,以达到最大程度的安全性。 为了有效地利用这两个库,开发者需要了解它们的功能...
在计算机科学中,Base64是一种用于将二进制数据转换为可打印ASCII字符的编码方式,常用于在电子邮件系统、HTML和XML文档中传输非ASCII字符...在实际开发中,根据具体需求选择合适的方法,可以确保代码的简洁性和效率。
在实际应用中,JavaScript通常不直接与数据库交互,而是通过服务器端脚本(如PHP、Node.js等)处理数据库操作。然而,一些现代浏览器支持Web SQL或IndexedDB,它们是客户端存储和操作数据的API,可以用JavaScript...
接下来,代码中使用base64.NewEncoding方法创建了一个自定义编码器(coder),然后定义了两个函数,分别是base64Encode和base64Decode。base64Encode函数接收一个字节切片作为输入,并返回base64编码后的字符串。...
为了解决这个问题,示例代码中使用了一个自定义的 `URLEncoding` 函数来进行字符串的UTF-8编码。这个函数逐个字符地遍历字符串,并将其转换为合适的格式。需要注意的是,这里使用的是VBScript来编写该函数,如果使用...