`
jessdy
  • 浏览: 60269 次
  • 性别: Icon_minigender_1
  • 来自: 上海虹口区
社区版块
存档分类
最新评论

中文参数问题

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

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

在web.xml中加入了非常通用的encodingfilter。但是在tomcat中发现这个filter没有发挥其应该发挥的作用,即参数出现中文时,会乱码。但是奇怪的是在websphere中未发现这样的情况,于是,开始搜索网上解决方案。虽然在tomcat中要解决这样的问题很简单,只需要在server.xml中修改Connector:
<Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" [color=red]URIEncoding="GBK" [/color] />

就能解决,但是问题的原因究竟在哪里,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,这样所产生了一个
<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
    </filter>

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

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

题外话:
中国的程序员始终是很辛苦的,要不断在编码问题上博弈。希望将来会。。。
分享到:
评论
5 楼 kxhu 2009-03-23  
谢 谢 !
4 楼 yisonghui 2008-05-06  
问下LZ,如果不想通过配置,想要在Action中处理这样的问题,并且框架类似于SPRING,在Action中没有request对象,这时该怎么处理呢?
3 楼 yisonghui 2008-05-06  
问下LZ,如果不想通过配置,想要在Action中处理这样的问题,并且框架类似于SPRING,在Action中没有request对象,这时该怎么处理呢?
2 楼 xuxiaolei 2008-04-29  
感谢楼主,我也一直被这个问题困扰,今天终于找到正确答案了。
1 楼 绝对可能 2008-04-29  
又长学问了。

相关推荐

Global site tag (gtag.js) - Google Analytics