涉及A、B、C这么3个应用
A应用的jsp页面(采用utf-8编码)点击一个链接(假定href=“http://localhost:8080/B/xhtmlsearch?docchannel=4469&param=%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应用我没权利去动它们。
请大家帮忙,先谢过。

解决方案 »

  1.   

    当前B应用的servlet中是这样获取参数的值
    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。
      

  2.   

    B接收到的参数 可以调用java提供的api给它编码,这样应该不会错落呀,你就直接接收吗?有没有对参数进行一些处理呢
      

  3.   

    B应用是部署在tomcat下的,在servlet中进行多种尝试,都搞不定,求解。
      

  4.   

    GBK编码下一个汉字两个字节
    param=%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97这里有15个字节
    本来就是不可能(或者说不应当)发生的
    所以最后一个字节%97无法被解码(单字节且高位为1,非ASCII字符),就用%3E(问号字符)代替了总之你不用管它,如果这种情况发生,说明A应用传给你的参数就错了
      

  5.   

    谢谢alexandertech,一下就找到了症结所在,的却是编码方式导致的解码问题
    实际上,A传过来的参数应该是UTF-8的吧,这样以来,5个汉字就是15个字节
    其实遇到的问题就是,如果汉字是奇数个,经过UTF-8转码,导致后边接收到的参数出错
    实质上,A传过来的参数是对的,偶数个汉字就没有这个问题。那么,有没有什么办法解决呢?
      

  6.   

    哦,是UTF-8啊
    那你必须这样:param = java.net.URLEncoder.encode(request.getParameter("param"),"UTF-8");相应的decode()也要用UTF-8否则,即使字节数是偶数个,你也只是看起来解对了
      

  7.   

    A传过来是用UTF-8的字符编码,为什么你要用GBK来接收呢?
      

  8.   

    可是,实际上偶数个的时候,servlet中
    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就可以啦。
      

  9.   

    尝试用UTF-8,可是print出来惨不忍睹啊!
      

  10.   

    向负责A应用维护的人确认了一下,%E7%85%A4%E7%84%A6%E6%B2%B9%E7%B3%BB%E5%88%97这样的东西,是通过js的encodeURI()方法转换汉字得来的(只encodeURI一次)。
      

  11.   

    在servlet 中可以写一个类似 字符转换的一个方法,比如说
    public String Convert(String ss){
    .........................}String param=Convert(request.getparameter("param"));
      

  12.   

    楼主只需要在B中把A传过来的参数直接加在发给C请求的后边就行了
    在B中取从A发过来的参数列表
    String paramFromA = request.getQueryString();发给C:
    c的url?+paramFromA 
    就可以了啊,你不需要去检查发过来的是啥东西,发过来啥,你就转过去啥就行了