文档章节

url 传参问题

feng_kill
 feng_kill
发布于 2013/12/17 17:06
字数 1468
阅读 129
收藏 1

行业解决方案、产品招募中!想赚钱就来传!>>>

开发一直用firfox网页,调试什么的都很方便。所以遇到了浏览器之间的兼容问题。url中文传参。

问题:前台用url传值中文,后台用request.getParameter接收参数。

       用firfox,chrome等没有问题。用ie会出现接参乱码现象。

 

上网查了一下,算了,还是把原文帖上来吧。比较容易懂。

 

  让jsp正确解释含有中文的URL以及传递中文参数是一个很有用的特性,也是比较复杂的。我去年的一个小项目中就碰到了在URL中传递中文参数的问题,但是当时由于对Jsp还不是很熟悉,所以没有解决这个问题因而舍弃了一部分功能。
  
  但是,这个问题确实得解决,因为在即将展开的一个项目中肯定得用它。于是,今天花了一天的时间来研究这个问题,好在功夫不负有心人,现在问题终于解决了。下面就做一下介绍:
  
  IE、Firefox、Opera三种浏览器对URL的传输的处理各不相同,浏 览器在传输URl时得对URL进行编码,IE默认是以UTF-8来传输的,Opera可能也是以UTF-8编码的,Firefox经过测试肯定不是以 UTF-8来编码的,有可能是以ISO-8859-1来编码的。所以如果不对中文进行处理,那么中文字符经各个浏览器以自己的编码方式传输到服务器后就出 现了各种编码方式,而服务器却只能以一种编码方式来对接收到的URL进行解码。这样的话,和服务器使用的编码方式一样的浏览器在使用带中文的URl时不会 出现问题,其他的浏览器则会出现问题。
  
  所以解决的办法就是在URL进行传输之前对其中的中文进行编码,使用的编码是和 服务器一样的编码,假设服务器使用的编码是UTF-8,则编码语句如下:URLEncoder.encode("中文","UTF-8")。这样对中文进 行编码后所有的浏览器都不会再用他们默认的编码方式对中文进行编码,因为此时浏览器看到的已经不是中文了,而是编码后的字节码。这样就避开了浏览器传输 URL时编码的差异性问题。
  
  对中文参数问题的解决方式和上面一样。但这里所指的中文参数是指 以?name="中文参数"方式附在URL后,以get方法传输到服务器的这种形式,并不是以表单形式提交到服务器的。各浏览器对中文参数的处理方式和各 自对URL中中文的处理方式都不相同,各浏览器之间也有差异,有的在传输之前不进行编码,有的在传输之前就已经进行了编码,情形非常复杂。
  
  但是我们以不变应万变,都用URLEncoder.encode("中 文","UTF-8")对中文参数进行编码,这样不管各浏览器怎样对中文参数进行处理,此时经过我们编码后的中文对浏览器来说就是字节码,与a、b、c等 字母没有什么区别。但是服务器会用UTF-8编码形式来还原中文参数。
  
  总结一下:以Tomcat服务器为例,在中添加URIEncoding="UTF-8",设置tomcat以utf-8的编码方式来处理URL。其次,对URL中的中文和中文参数都用URLEncoder.encode("中文","UTF-8")进行编码。

 

 

再有,就是在后台进行转码。

点击后打开新页面,用户登录!用户名为中文时,火狐、google浏览器无问题,但IE有乱码问题:

问题代码:

Java代码  
  1. <a href="member!sysLogin.do?name='${member.uname }'" target="_blank" />登录</a>   

  超链接形式的传参,都是Get方式!

Java代码  
  1. public String sysLogin(){  
  2.     try{  
  3.         name=new String(name.getBytes("iso-8859-1"),"utf-8");  
  4.         int r  = this.memberManager.loginbysys(name);  
  5.         if(r==1){  
  6.             return "syslogin";  
  7.         }  
  8.         this.msgs.add("登录失败");  
  9.           
  10.     }catch(RuntimeException e){  
  11.         this.msgs.add(e.getMessage());            
  12.     } catch (UnsupportedEncodingException e) {  
  13.         this.msgs.add(e.getMessage());            
  14.     }  
  15.     return this.MESSAGE;  
  16. }  

 修改成功:

Java代码  
  1. <a href="javascript:toSysLogin('${member.uname }');"  />登录</a>  
  2.   
  3. function toSysLogin(name){  
  4.     var uriname="member!sysLogin.do?name="+name;  
  5.     window.open( encodeURI(uriname));  
  6. }  
 
Java代码  
  1. public String sysLogin(){  
  2.         try{  
  3.             this.setName(java.net.URLDecoder.decode(name, "UTF-8"));// 此处转码  
  4.             name=new String(name.getBytes("iso-8859-1"),"utf-8");  
  5.             int r  = this.memberManager.loginbysys(name);  
  6.             if(r==1){  
  7.                 return "syslogin";  
  8.             }  
  9.             this.msgs.add("登录失败");  
  10.               
  11.         }catch(RuntimeException e){  
  12.             this.msgs.add(e.getMessage());            
  13.         } catch (UnsupportedEncodingException e) {  
  14.             this.msgs.add(e.getMessage());            
  15.         }  
  16.         return this.MESSAGE;  
  17.     }  

 问题解决!

encode编码

decode解码

 

 

这里有个全的。。

 

JAVA 中URL链接中文参数乱码的若干处理方法,现在整理收录如下: 

方法一: 

http://xxx.do?ptname='我是中国人' 

String strPtname = request.getParameter("ptname"); 

strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8");   

方法二: 

<%@ page contentType="text/html;charset=gb2312" %> 

<a href="ds.jsp?url=<%=java.net.URLEncoder.encode("编码的是这里","GB2312")%>">点击这里</a> 

<% 

//request.setCharacterEncoding("GBK"); 

if(request.getParameter("url")!=null) 



str=request.getParameter("url"); 

str=java.net.URLDecoder.decode(str,"GB2312"); 

str=new String(str.getBytes("ISO-8859-1")); 

out.print(str); 



%> 

================================== 

public String chinatoString(String str) 

     { 

      String s=str; 

      try 

      { 

       byte tempB[]=s.getBytes("ISO-8859-1"); 

       s=new String(tempB); 

       return s; 

      } 

      catch(Exception e) 

      { 

       return s; 

      } 

    } 

==================================================== 

function URLencode(sStr) 

    { 

      return escape(sStr). 

               replace(/\+/g, '%2B'). 

                  replace(/\"/g,'%22'). 

                     replace(/\'/g, '%27'). 

                       replace(/\//g,'%2F'); 

    } 

方法三: 

如果用jstl的话,可以自己写一个el的function,调用URLEncoder.encode来编码。 

IE缺省对URL后面的参数是不编码发送的,但是tomat缺省是按ISO8859-1来进行URL解码,因此才会出现上述错误。好的做法是: 

1、在URL参数中确保用UTF-8编码之,方法可以用js函数encodeURI(),或调用自定义的el function; 

2、设置server.xml中的Connector熟悉URIEncoding="UTF-8",确保解码格式与编码格式统一; 

方法四: 

<script> 

for(var i=0;i<document.links.length;i++){ 

document.links[i].href=encodeURI(document.links[i].href); 



</script> 

在action中,String s=request.getParameter("s"); 

s=new String(s.getBytes("iso-8859-1"),"gbk"); 

以上方法是收聚了一些网友所讲的解决方法 。
feng_kill
粉丝 0
博文 5
码字总数 0
作品 0
东城
程序员
私信 提问
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
21
c-string转换工具集合--stringencoders

c-string转换工具集合,比标准实现快2倍以上(如果有的话)。——该项目被Google Chrome使用。 包括以下C字符串转换工具 base64, standard base64, web/url safe, with configurable alphabe...

江斌
2012/11/07
4.8K
1
android下载加速器--axeldroid

axel 是一个linux上的轻量级下载加速器,http://axel.alioth.debian.org/ axeldroid 是将axel移植到android上,并且经过优化,实现了axel的大部分功能,可以指定下载连接数,定时刷新下载进度...

yiitz
2012/12/20
1.9K
1
HTML动态嵌入Flash--embedSWF

embedSWF 是一个轻量的HTML动态嵌入Flash的方案。gzip之前,仅3kb大小!比swfobject要小很多。 简洁的API,所有object和embed标记支持的参数都通过一个options传递。甚至支持在options中传递...

JonyZhang
2013/05/01
5K
2
Android 快速开发框架--ThinkAndroid

ThinkAndroid简介 ThinkAndroid是一个免费的开源的、简易的、遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单、快速的进行Android应用程序的开发,包含Androidmvc、简易sqlite ...

white-cat
2013/05/05
6.8W
6

没有更多内容

加载失败,请刷新页面

加载更多

在新标签页(而不是新窗口)中打开URL - Open a URL in a new tab (and not a new window)

问题: I'm trying to open a URL in a new tab, as opposed to a popup window. 我正在尝试在新选项卡(而不是弹出窗口)中打开URL 。 I've seen related questions where the responses wo......

富含淀粉
今天
17
0
HTML中id属性的有效值是什么? - What are valid values for the id attribute in HTML?

问题: 为HTML元素创建id属性时,该值有哪些规则? 解决方案: 参考一: https://stackoom.com/question/IMN/HTML中id属性的有效值是什么 参考二: https://oldbug.net/q/IMN/What-are-vali...

法国红酒甜
今天
25
0
mysql innodb 可重复 幻读问题

1 mvcc 解决快照读幻读 2 GAP 锁解决 当前读幻读 (insert时 插入意向锁会等待GAP锁)

yzzzzzzzz
今天
25
0
画风清奇,用开源机器人项目实现“云毕业典礼”

本文作者:o****0 前几天,南京邮电大学的一场毕业典礼引起了吃瓜群众的热议,先来看看这个画风: 由于疫情原因,很多高校的学生只能在家里通过线上视频的方式完成毕业论文答辩。答辩通过后,...

百度开发者中心
07/31
16
0
2020年TOP7的编程语言和框架,它们至少还能风靡全球5年以上

在本文中,我们将看一看由我推荐的编程语言和框架列表,我相信在接下来的5年至10年中,对于开发者来说,这份列表中的语言和框架仍然会有用。同时考虑到我不希望该列表仅是另一个备受好评的编...

京东智联云开发者
今天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部