2008-06-26
apachet转发请求到tomcat的中文化问题解决方案
在用mapguide做webgis应用的时候,再次遇到中文化问题。
场景是这样的:
由于某种需求的原因,有个请求必须用get的方式传送,而且url参数中含有中文。
首先,我在发送请求之前,用encodeURI将中文参数编码了。
代码示意如下:
然后,在tomcat端接收到参数的时候,通过URIDecoder.decode来将参数解码。
代码如下:
另外有个Filter将request和response的charactorEncoding设置为UTF-8。
代码如下:
但是我在调试的时候发现在filter起作用之前,中文参数已经是乱码了,而其他通过post方式传送的中文参数不受影响。这样,我在tomcat端作的所有工作都是白费。
问题在那里呢?我在网上google了一把,有人说在apache的httpd.conf里面,要把AddDefaultCharset 设置成这个样子:AddDefaultCharset off。
原文大概如此:
服务器端:
======
修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/)
查找:
AddDefaultCharset ISO-8859-1
改成:
#AddDefaultCharset ISO-8859-1
AddDefaultCharset off
这种方式关掉了服务器的默认语言的发送,这样仅凭html文件头中设置的语言来决定网页语言。
很多文章都说通过修改为 AddDefaultCharset GB2312 把缺省语言改成GB2312来解决中文乱码,确实GB2312内码的网页可以正常显示了,但这并非万全之策。因为当你的网页内码不是GB2312,就算你在网页用下面的meta指定了正确的语言,如ISO8859-1,也不会解码为ISO8859-1,因为Apache已经先你一步将GB2312指定为网页的语言了
可是我在mapguide的apache里面,发现它根本就没有使用这个配置。
我尝试给apache加上AddDefaultCharset ISO-8859-1,没有。改成AddDefaultCharset UTF-8,也没用。改成AddDefaultCharset off,还是没有用。
这么看来,问题不在apache的配置这里了。
那么问题在那里呢??!我晕掉了。
后来我想起了一个问题,请求是apche转发给tomcat的,那么会不会是apache转到tomcat的时候,出现的乱码呢?
于是,我把tomcat配置转接接口的配置改了一下
代码如下:
后面这个URIEncoding="UTF-8"就是我加上去的东西,原来是没有这个的。
然后测试。果然,乱码没有了。
场景是这样的:
由于某种需求的原因,有个请求必须用get的方式传送,而且url参数中含有中文。
首先,我在发送请求之前,用encodeURI将中文参数编码了。
代码示意如下:
var params = .... params = encodeURI(params); url = url + '&' + params; ...
然后,在tomcat端接收到参数的时候,通过URIDecoder.decode来将参数解码。
代码如下:
public static Map<String, String> decodeRequestToMap(HttpServletRequest request) {
Map<String, String> m = new HashMap<String, String>();
Enumeration<String> e = request.getParameterNames();
try {
while(e.hasMoreElements()) {
String k = e.nextElement();
String value = URLDecoder.decode(request.getParameter(k), "UTF-8");
m.put(k, value);
}
} catch (UnsupportedEncodingException e1) {
if (log.isErrorEnabled()) {
log.error("不可能不支持UTF-8的啊!", e1);
}
}
return m;
}
另外有个Filter将request和response的charactorEncoding设置为UTF-8。
代码如下:
request.setCharacterEncoding(this.charactorEncoding);
response.setCharacterEncoding(this.charactorEncoding);
chain.doFilter(request, response);
但是我在调试的时候发现在filter起作用之前,中文参数已经是乱码了,而其他通过post方式传送的中文参数不受影响。这样,我在tomcat端作的所有工作都是白费。
问题在那里呢?我在网上google了一把,有人说在apache的httpd.conf里面,要把AddDefaultCharset 设置成这个样子:AddDefaultCharset off。
原文大概如此:
引用
服务器端:
======
修改httpd.conf (在Redhat中放置的位置为/etc/httpd/conf/)
查找:
AddDefaultCharset ISO-8859-1
改成:
#AddDefaultCharset ISO-8859-1
AddDefaultCharset off
这种方式关掉了服务器的默认语言的发送,这样仅凭html文件头中设置的语言来决定网页语言。
很多文章都说通过修改为 AddDefaultCharset GB2312 把缺省语言改成GB2312来解决中文乱码,确实GB2312内码的网页可以正常显示了,但这并非万全之策。因为当你的网页内码不是GB2312,就算你在网页用下面的meta指定了正确的语言,如ISO8859-1,也不会解码为ISO8859-1,因为Apache已经先你一步将GB2312指定为网页的语言了
可是我在mapguide的apache里面,发现它根本就没有使用这个配置。
我尝试给apache加上AddDefaultCharset ISO-8859-1,没有。改成AddDefaultCharset UTF-8,也没用。改成AddDefaultCharset off,还是没有用。
这么看来,问题不在apache的配置这里了。
那么问题在那里呢??!我晕掉了。
后来我想起了一个问题,请求是apche转发给tomcat的,那么会不会是apache转到tomcat的时候,出现的乱码呢?
于是,我把tomcat配置转接接口的配置改了一下
代码如下:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
后面这个URIEncoding="UTF-8"就是我加上去的东西,原来是没有这个的。
然后测试。果然,乱码没有了。
评论
xieboxin
2008-07-16
其实不用改tomcat或apache的文件,程序改为:
String par = new String(request.getParameter(k).getByte("ISO-8859-1"),"UTF-8")
这样就OK……
String par = new String(request.getParameter(k).getByte("ISO-8859-1"),"UTF-8")
这样就OK……
xuxiangpan888
2008-07-15
谢谢了我今天才刚解决了,
以前就是奇怪用tomcat好的,用了apache后还要再转一次,现在不要了
以前就是奇怪用tomcat好的,用了apache后还要再转一次,现在不要了
jhj823900
2008-06-26
很老的问题了,一般实际开发都是这样做的,至少我们用的tomcat5.0.28是这样处理的
跟apache一点关系没有,也就是以前用8080也是加这个URIEncoding,现在结合apache是用的8009而已,所以把8080那里用的移过来了.
跟apache一点关系没有,也就是以前用8080也是加这个URIEncoding,现在结合apache是用的8009而已,所以把8080那里用的移过来了.
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 18851 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
链接
最新评论
-
apachet转发请求到tomcat ...
其实不用改tomcat或apache的文件,程序改为: String par ...
-- by xieboxin -
apachet转发请求到tomcat ...
谢谢了我今天才刚解决了, 以前就是奇怪用tomcat好的,用了apache后还 ...
-- by xuxiangpan888 -
apachet转发请求到tomcat ...
很老的问题了,一般实际开发都是这样做的,至少我们用的tomcat5.0.28是这 ...
-- by jhj823900 -
jBPM的Scheduler模块和Sp ...
提示个方法。。用JobExecutorServlet方法来代替你的Schedul ...
-- by gabriel80 -
spring 学习日记 - 基于 ...
ms可以这样 <bean class="org.springframewo ...
-- by sgfgh






评论排行榜