涉及A、B、C这么3个应用
A应用的jsp页面(采用utf-8编码)点击一个链接(假定href=“http://localhost:8080/B/xhtmlsearch?docchannel=4469¶m=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97”),点击链接,提交请求到B应用
B应用的servlet对请求进行处理,处理完毕后,B应用的Servlet进行response.sendRedirect到C应用。url为http://localhost:8080/C/xxxx.jsp?param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97也就是说:C应用需要A应用传递过来的中文参数,譬如A应用给的参数param值为“E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97”,经过B应用之后,要原封不动将param的值传给C应用。
现在想问的是:B应用的servlet中该怎么接收参数,才能保证A传过来的param值是什么,B中拿到的就是什么。前提:A应用和C应用我没权利去动它们。
请大家帮忙,先谢过。
A应用的jsp页面(采用utf-8编码)点击一个链接(假定href=“http://localhost:8080/B/xhtmlsearch?docchannel=4469¶m=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97”),点击链接,提交请求到B应用
B应用的servlet对请求进行处理,处理完毕后,B应用的Servlet进行response.sendRedirect到C应用。url为http://localhost:8080/C/xxxx.jsp?param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97也就是说:C应用需要A应用传递过来的中文参数,譬如A应用给的参数param值为“E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97”,经过B应用之后,要原封不动将param的值传给C应用。
现在想问的是:B应用的servlet中该怎么接收参数,才能保证A传过来的param值是什么,B中拿到的就是什么。前提:A应用和C应用我没权利去动它们。
请大家帮忙,先谢过。
param = java.net.URLEncoder.encode(request.getParameter("param"),"GBK");
发现如果是偶数个汉字过来,是正确的,奇数个的时候最后一个会错乱掉
譬如,如果param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB,
那么servlet中的param值也是%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB
而,param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97时
那么servlet中的param值就变成了%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%3E特别说明,我能动的只是B应用中的这个Servlet。
param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97这里有15个字节
本来就是不可能(或者说不应当)发生的
所以最后一个字节%97无法被解码(单字节且高位为1,非ASCII字符),就用%3E(问号字符)代替了总之你不用管它,如果这种情况发生,说明A应用传给你的参数就错了
实际上,A传过来的参数应该是UTF-8的吧,这样以来,5个汉字就是15个字节
其实遇到的问题就是,如果汉字是奇数个,经过UTF-8转码,导致后边接收到的参数出错
实质上,A传过来的参数是对的,偶数个汉字就没有这个问题。那么,有没有什么办法解决呢?
那你必须这样:param = java.net.URLEncoder.encode(request.getParameter("param"),"UTF-8");相应的decode()也要用UTF-8否则,即使字节数是偶数个,你也只是看起来解对了
param = java.net.URLEncoder.encode(request.getParameter("param"),"GBK");
System.out.println("=======/////----/////=======" + param);
打印出来的和传过来的是一致的。奇数个的时候,只有最后一个字节是错的。这又怎么解释呢(难道传过来的就是GBK)?
要做的事情是这样的,A传过来的param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97,在servlet中通过request拿到,print出来值还是%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97就可以啦。
public String Convert(String ss){
.........................}String param=Convert(request.getparameter("param"));
在B中取从A发过来的参数列表
String paramFromA = request.getQueryString();发给C:
c的url?+paramFromA
就可以了啊,你不需要去检查发过来的是啥东西,发过来啥,你就转过去啥就行了