中文参数问题

问题的产生:
做了这样一个功能,记录所访问过的历史网址,然后放入一个栈中,以便查看历史能顺利返回到曾经访问过的历史页面,由于将所有的参数也一起放在栈中构造了一个带参的URL,所以对于一些参数中存在中文的URL,就不可避免的遇到了中文参数以GET方式提交的情况。

开发环境是:Tomcat 5.x
生产环境是:Websphere 6.1

在web.xml中加入了非常通用的encodingfilter。但是在tomcat中发现这个filter没有发挥其应该发挥的作用,即参数出现中文时,会乱码。但是奇怪的是在websphere中未发现这样的情况,于是,开始搜索网上解决方案。虽然在tomcat中要解决这样的问题很简单,只需要在server.xml中修改Connector:

Xml代码
  1. <Connector port="8080" maxHttpHeaderSize="8192"  
  2.                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
  3.                enableLookups="false" redirectPort="8443" acceptCount="100"  
  4.                connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>  


就能解决,但是问题的原因究竟在哪里,websphere是否需要同样的配置,或者是否已经有类似的配置了?这些问题必须搞清楚,不然很难控制。

问题的原因:
首先说说tomcat产生这个问题的原因,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的却进行了不同的处理,对于post方法,采用了和tomcat4的编码处理方法,通过request.setCharacterEncoding进行编码处理,而get方法将通过URI提交处理,tomcat会查找server.xml文件中Connector 元素中的参数URIEncoding的值进行对URI进行encoding,如果没有这个值,将用iso8859-1进行encoding,这样所产生了一个

Xml代码
  1. <filter>  
  2.         <filter-name>Set Character Encoding</filter-name>  
  3.         <filter-class>filters.SetCharacterEncodingFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>encoding</param-name>  
  6.             <param-value>GBK</param-value>  
  7.         </init-param>  
  8.     </filter>  


无法同时解决post和get的提交编码。这样一来就说明产生问题的原因并不是encoding的问题,而是tomcat处理的问题,而websphere没有出现这样的问题,可以认为websphere对于post和get方法是一致的,统一通过filter来。

问题解决方案2:
对于tomcat处理这个问题的方法并不是单一的。tomcat的connector元素中另外提供了useBodyEncodingForURI参数,其值为boolean型,true代表使用处理body的encoding方法(即request.setCharacterEncoding)来处理URI的编码,这样就可以用一个过滤器来同时处理post和get方法了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值