java severlet post请求出现乱码,servlet请求乱码问题

有时候在servlet中接收到的数据会出现乱码问题。

乱码的产生原因

当用户通过浏览器提交一个包含 UTF-8 编码格式的两个中文请求时,浏览器会将这两个中文字符变为六个字节(一般一个 UTF-8 汉字占用三个字节),即形成六个类似%8E 的字节表示形式,并将这六个字节上传至 Tomcat 服务器。

Tomcat 服务器在接收到这六个字节后,并不知道它们原始采用的是什么字符编码。而Tomcat 默认的编码格式为 ISO-8859-1。所以会将这六个字节按照 ISO-8859-1 的格式进行解码,解码后在控制台显示,所以在控制台会显示乱码。

乱码的解决方案

针对 POST 提交乱码的解决方式

在接收请求参数之前先通过 request 的 setCharacterEncoding()方法,指定请求体的字符编码格式。这样的话,在接收到请求中的参数后,就可按照指定的字符编码进行解码。

注意,request 的 setCharacterEncoding()方法只能解决 POST 提交方式中的乱码问题,对

于 GET 提交方式的不起作用。因为该方法设置的是请求体中的字符编码, GET 提交中的参数不出现在请求体中,而出现在请求行。

//设置post请求的字符编码

request.setCharacterEncoding("utf-8");

//根据html中的name的名字获取用户在input中填写的值

String username = request.getParameter("username");

String password = request.getParameter("password");

//获取用户勾选的checkbox的值

String[] hobby = request.getParameterValues("hobby");

System.out.println(username);

System.out.println(password);

for(String s:hobby){

System.out.println(s);

}

针对get提交乱码的解决方式

可以通过修改 Tomcat 默认字符编码的方式来解决 GET 提交方式中携带中文的乱码问题。在 Tomcat 安装目录的 conf/server.xml 中,找到端口号为 8080 的标签,在其中添加 URIEncoding=”UTF-8″的设置,即可将 Tomcat 默认字符编码修改为 UTF-8。

需要注意的是在修改时要找到正确的server.xml文件。

IDEA中在启动tomcat的时候,控制台的最上面有一项是Using CATALINA_BASE,这个后面是一个文件路径,进入后,打开里面的conf文件夹,修改这里的server.xml即可。

eclipse中双击tomcat服务器,如下图:

519e603ace32f72f281211302cefda91.png

上图中有三个选项,不同的选项表示使用的不同路径下的tomcat

表示使用eclipse工作空间的tomcat,该路径在工作空间目录中的.metadata.plugins\org.eclipse.wst.server.core\tmp0目录中,如果你使用的是这个(eclipse会默认使用这个),需要修改该目录中的server.xml才会生效。

表示使用我单独下载的tomcat所在的路径,我本机的是在:F:\monkey1024\apache-tomcat-9.0.0.M26中,如果你使用的是这个,需要修改该目录中的server.xml文件。

表示自定义一个位置,即手动指定web应用运行的目录位置,如果你使用的是这个,需要修改该目录中的server.xml文件。

万能解决方案

//根据html中的name的名字获取用户在input中填写的值

String username = request.getParameter("username");

//将数据按照ISO8859-1编码后放到字节数组中

byte[] bytes = username.getBytes("ISO8859-1");

//将字节数组按照UTF-8解码为字符串

username = new String(bytes,"UTF-8");

先以 ISO8859-1 的形式先对单字节的数据进行编码,并将编码后的数据存放在字节数组中。然

后,再将字节数组中的数据,按照指定的 UTF-8 格式进行解码,即变为了需要的 UTF-8 字符

编码的数据,解决了中文乱码问题。

通过上面的代码就可以解决get和post的乱码问题,但是代码量较大,开发中使用较少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值