javaWeb项目编码问题探索
2016-01-15 23:56
405 查看
这两天遇到了javaweb项目中乱码的问题,想趁此机会搞搞清楚,顺便把过程记录下来,方便以后查看。
首先新建一个动态javaweb工程,写两个jsp,index.jsp和a.jsp,如下图
![](http://img.blog.csdn.net/20160115233147973?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160115224450770?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
启动项目,由于表单里的值默认是中文,不出意外,均显示乱码
![](http://img.blog.csdn.net/20160115233450216?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们常规的做法就是在b.jsp页面上的request内置对象中设置编码:
![](http://img.blog.csdn.net/20160115225141838?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再次提交,发现post请求正常了,但是get请求仍不正常
![](http://img.blog.csdn.net/20160115233746634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这是怎么回事呢?这个疑问先放着,继续往下探索,将b.jsp中做一些改变:
![](http://img.blog.csdn.net/20160115225715176?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再看post和get方式的提交结果:
![](http://img.blog.csdn.net/20160115234105353?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
根据以上现象,我们可以得出两个结论:
1.request.setCharacterEncoding()方式的编码过滤只对post请求起作用,get请求并没有起作用;
2.不管是post请求还是get请求,项目中接收到的参数都是“ISO-8859-1”编码的;
有些人就要问了,这个“ISO-8859-1”肯定是哪里配置的吧,ok,这个确实是可配置的,打开tomcat安装目录/conf/server.xml,找到:
在此节点后追加属性URIEncoding="UTF-8":
查看$TOMCAT_HOME/webapps/tomcat-docs/config/http.html这个说明文档,有如下说明: URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 也就是说,如果没有设置URIEncoding, Tomcat默认是按ISO-8859-1进行URL解码,ISO-8859-1并未包括中文字符,这样的话中文字符肯定就不能被正确解析了。
将b.jsp复原至最初的状态后再次测试(由于使用eclipse自动部署仅重启tomcat貌似无法让server.xml中的改动生效,为得到正确结果不影响判断,从此处改为导出war包后加入tomcat的webapps目录下手动启动tomcat):
![](http://img.blog.csdn.net/20160115224450770?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再次运行结果可以发现,post请求为乱码,get请求好了:
![](http://img.blog.csdn.net/20160115234826253?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个结果验证了之前的解释,URIEncoding属性的值代表着 Tomcat进行URL解码时的字符集(默认为"ISO-8859-1"),即get请求,但其并不影响post请求,post请求依据的字符编码为request.getCharacterEncoding()的值,默认也为"ISO-8859-1"(但不清楚该默认值是否可更改),如此一来,此属性和编码过滤器配合使用,即可实现get和post请求均正常显示。
![](http://img.blog.csdn.net/20160115235248753?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160115234105353?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
.
另外介绍一个参数useBodyEncodingForURI,useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding.当该参数设置为true时,get请求的编码方式也将根据request.getCharacterEncoding()的值来确定,和URIEncoding的区别在于可为不同url路径设置不同的编码(感觉一般人不会这么干,最多是为同一个tomcat下的不同项目设置不同的编码),如此一来,将此方法设置为true,并设置好编码过滤,即request.setCharacterEncoding(),也可以使整个项目的编码统一。
![](http://img.blog.csdn.net/20160115225141838?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160115234105353?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
参考博客(推荐阅读):/article/2631451.html
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
/article/2821969.html
首先新建一个动态javaweb工程,写两个jsp,index.jsp和a.jsp,如下图
启动项目,由于表单里的值默认是中文,不出意外,均显示乱码
我们常规的做法就是在b.jsp页面上的request内置对象中设置编码:
再次提交,发现post请求正常了,但是get请求仍不正常
这是怎么回事呢?这个疑问先放着,继续往下探索,将b.jsp中做一些改变:
再看post和get方式的提交结果:
根据以上现象,我们可以得出两个结论:
1.request.setCharacterEncoding()方式的编码过滤只对post请求起作用,get请求并没有起作用;
2.不管是post请求还是get请求,项目中接收到的参数都是“ISO-8859-1”编码的;
有些人就要问了,这个“ISO-8859-1”肯定是哪里配置的吧,ok,这个确实是可配置的,打开tomcat安装目录/conf/server.xml,找到:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
在此节点后追加属性URIEncoding="UTF-8":
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
查看$TOMCAT_HOME/webapps/tomcat-docs/config/http.html这个说明文档,有如下说明: URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 也就是说,如果没有设置URIEncoding, Tomcat默认是按ISO-8859-1进行URL解码,ISO-8859-1并未包括中文字符,这样的话中文字符肯定就不能被正确解析了。
将b.jsp复原至最初的状态后再次测试(由于使用eclipse自动部署仅重启tomcat貌似无法让server.xml中的改动生效,为得到正确结果不影响判断,从此处改为导出war包后加入tomcat的webapps目录下手动启动tomcat):
再次运行结果可以发现,post请求为乱码,get请求好了:
这个结果验证了之前的解释,URIEncoding属性的值代表着 Tomcat进行URL解码时的字符集(默认为"ISO-8859-1"),即get请求,但其并不影响post请求,post请求依据的字符编码为request.getCharacterEncoding()的值,默认也为"ISO-8859-1"(但不清楚该默认值是否可更改),如此一来,此属性和编码过滤器配合使用,即可实现get和post请求均正常显示。
.
另外介绍一个参数useBodyEncodingForURI,useBodyEncodingForURI:This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding.当该参数设置为true时,get请求的编码方式也将根据request.getCharacterEncoding()的值来确定,和URIEncoding的区别在于可为不同url路径设置不同的编码(感觉一般人不会这么干,最多是为同一个tomcat下的不同项目设置不同的编码),如此一来,将此方法设置为true,并设置好编码过滤,即request.setCharacterEncoding(),也可以使整个项目的编码统一。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
参考博客(推荐阅读):/article/2631451.html
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html
/article/2821969.html
相关文章推荐
- Eclipse-----Eclipse设置字体
- eclipse快捷键大全
- Eclipse使用笔记
- Eclipse-----Eclipse导入源码
- Java学习1
- java基础介绍(转)
- Java I/O操作总结
- java保存两位小数
- Java注解入门
- JAVA常用类库
- Java线程的中断
- Eclipse-----Eclipse各种小图标的含义
- Spring+SpringMVC+mybatis
- java后台的数据层数据组织
- Spring核心IOC容器实现分析
- ubuntu eclipse菜单栏消失的解决
- ubuntu eclipse启动报错
- Mybatis学习(4)与spring3集成
- weka+eclipse算法二次开发(2)
- java代码创建文件和文件夹