文档章节

javaWeb项目编码问题探索

一缕清风
 一缕清风
发布于 2016/07/12 18:38
字数 819
阅读 107
收藏 2
点赞 0
评论 0

这两天遇到了javaweb项目中乱码的问题,想趁此机会搞搞清楚,顺便把过程记录下来,方便以后查看。

首先新建一个动态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" />



参考博客(推荐阅读):http://blog.csdn.net/hengyunabc/article/details/17053585

    http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

                  http://blog.csdn.net/superch0054/article/details/9325793

本文转载自:http://blog.csdn.net/baokx/article/details/50526272

共有 人打赏支持
一缕清风
粉丝 5
博文 124
码字总数 375
作品 0
东城
java项目与UCenter整合

我想将一个javaWeb项目与UCenter整合,下载了discuz-ucenter-api-for-java并部署到自己的javaWeb系统里面,可是用测试类调试的时候,出现Exception in thread "main" java.lang.NumberFormat...

葡萄枝
2014/01/27
1K
3
八面山人/quick4j

quick4j 后期我准备在branch里加一个spring-boot的版本。 quick4j 是一个通用JavaWeb项目骨架, 积极在探索使用Java、Web等一系列技术,搭建开发高性能、高可拓展性、高可维护性,高安全性的...

八面山人
2016/04/14
0
0
JSP笔记——简单javaWeb的文件结构

创建简单javaWeb的步骤: ①在Tomcat下的WebApps创建项目目录 ②编写index.jsp ③创建WEB-INF目录 ④测试运行 ①在Tomcat下的WebApps创建项目目录 创建项目目录myhome ②编写index.jsp ③创建...

努力学习ding
05/17
0
0
表单传输后台乱码是什么原因?表单数据获取方法中get/post区别解析

在JSP传输数据时,不管是表单传输或者ajax操作,它们的method或者type都是get或者post,并且它们的默认传输编码为”ISO8859-1”.  1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议...

xc121566的博客
2017/12/11
0
0
JAVAWEB贵美网上商城完整项目源码(SSH2)

JAVAWEB贵美网上商城完整项目源码(SSH2) 贵美网上商城原是北大青鸟的一个内部项目,项目采用 struts2+spring4+hibernate4+MySQL等技术实现,数据库连接池采用c3p0的方式。 贵美商城包括前后台...

小柒2012
2016/12/28
183
0
关于HTTP请求的post与get

HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST. HTTP-GET和HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GE...

manlianman
2014/04/10
0
0
JavaWeb开发基础

1、应用服务器 Java的应用服务器:Tomcat,JBoss,WebSphere,WebLogic,Resin。这里主要以Tomcat为主。 Tomcat的安装: 1.1、下载Tomcat(http://tomcat.apache.org/) 1.2、在环境变量中设...

pmos
2016/08/15
35
0
Eclipse中Tomcat配置问题

前言: 昨天用javaSE手动部署了一个servlet,本以为自己已经初步窥探了,结果一用eclipse生成javaweb项目 然后部署到Tomcat就问题多多。这一天也算是栽在这上面了。 java后台自学ing的弊端就...

codingcoge
06/07
0
0
java项目与javaweb项目导入jar包的区别

现在的项目基本上都是java web项目,所以导入jar包会出现问题,主要介绍一下java项目与javaweb项目的区别: java项目: 在classLoader加载jar和class的时候,是分开加载的,一般jar导入分两种: 1.在...

低调的AckMan
2015/12/11
1K
0
一个被忽略的可能 会出现乱码问题的地方,tomcat 字符配置

Javaweb 项目,后端接收中文参数的时候 会遇到乱码问题,很常见。(1)request.setCharacterEncoding("UTF-8");//必须写在第一位,因为采用这种方式去读取数据 (2)web.xml Encodeingcn.servlet...

qmxzhang
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

聊聊ribbon的超时时间设置

序 本文主要研究一下ribbon的超时时间设置 配置 实例 ribbon: ReadTimeout: 10000 ConnectTimeout: 10000 MaxAutoRetries: 0 MaxAutoRetriesNextServer: 1 eureka: enabled: ......

go4it
1分钟前
0
0
一行代码结果叹为观止,能做到这么极致的也只有python了

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Python 代码都可以做些什么。 一行打印...

猫咪编程
5分钟前
0
0
KingShard使用

Windows下: win下clone下代码,根据文档 go build -o bin/kingshard.exe ./cmd/kingshard 编译不通过,需要注释掉: /*sc := make(chan os.Signal, 1)signal.Notify(sc,syscall...

mickelfeng
6分钟前
0
0
Linux 下 查找某个字符串

如果你想在当前项目下 查找 "test" 这个字符串,可以这样: grep -rn "test" * * : 表示当前目录所有文件,也可以是某个文件名-r 是递归查找-n 是显示行号-R ...

nsns
7分钟前
0
0
数据结构 之 B树与红黑树

https://blog.csdn.net/v_july_v/article/details/6530142 http://www.cnblogs.com/CarpenterLee/p/5503882.html...

晨猫
7分钟前
0
0
Linux查看服务器总内存和总硬盘大小

一、linux CPU大小; 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到. flags 如果有 ht 说明支持超线程技术 判断物理CPU的个数可...

浮躁的码农
7分钟前
0
0
Postfix命令行说明

Postfix tips and Troubleshooting Commands Here's a list of stuff I user everyday and other email admins will also be using, Let me know if I missed anything List/Print current m......

mingle
13分钟前
0
0
是时候使用Helm了:Helm, Kubernetes的包管理工具

目前我们的一个产品共有4套环境:dev环境、test环境、staging环境、production环境。 其中dev, test, staging环境在一个Kubernetes集群上以不同namespace部署,production环境部署在另一个Kub...

xiaomin0322
21分钟前
0
0
常见的redis的序列化方式

概括 一般redis的序列化方式主要有:字符串序列化、json序列化、xml序列化、jdk序列化,具体可查阅org.springframework.data.redis.serializer.RedisSerializer 的实现类,其中对于json序列化...

菜蚜
35分钟前
1
0
Linux bash入门

一、Linux Bash介绍 Bash是UNIX系统下的一个命令解析器,全称为Bourne-Again Shell是一个为GNU开源项目编写的Unix shell。bash功能强大,尤其是在处理自动循环或者耗时大的任务方面可以节省大...

老韭菜
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部