Servlet处理get请求时的中文乱码问题

我们都知道,使用Servlet处理get请求时,如果get请求的参数中有中文,直接接收会是乱码,这个时候我们使用类似下面的语句来处理乱码:

12345
String name = request.getParameter("name");System.out.prinlnt(name); // 乱码// 处理乱码name = new String(name.getBytes("ISO8859-1"),"UTF-8");System.out.println(name);// 乱码问题解决

这时候每次中文都要处理,比较麻烦,我们可能会使用过滤器,使用类型下面的代码处理乱码问题:

1234567891011121314
public String getParameter(String name) {	String value = super.getParameter(name);	if (value == null)		return null;	String method = request.getMethod();	if ("get".equalsIgnoreCase(method)) {		try {			value = new String(value.getBytes("ISO8859-1"),"UTF-8");		} catch (UnsupportedEncodingException e) {			e.printStackTrace();		}	}	return value;}

但是,这是为什么呢?为什么我们需要将ISO8859-1转为UTF-8?为什么我们接收到的参数是ISO8859-1这种编码方式的?
其实很简单,只是个配置问题:
在tomcat安装目录下的conf/server.xml中,有如下的配置:

1
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

我们可能改动过这里的port为9999,8888等自己喜欢的端口号,这里呢,也可以设置另外一个跟上述编码问题有关的参数信息:URIEncoding,该配置决定了使用get请求通过浏览器地址栏访问tomcat时的编码方式,默认的编码方式使ISO8859-1,这一点我们可以从官网文档https://tomcat.apache.org/tomcat-7.0-doc/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.

知道了这点,接下来就简单了,我们可以这样配置,则上述代码中,就不需要再从ISO8859-1转为UTF-8了:

1
URIEncoding="UTF-8"

这显然比上述两种方式简单多了。

值得注意的是,从tomcat8.0开始,URIEncoding默认值不再是ISO8859-1,而变成了UTF-8
官方文档https://tomcat.apache.org/tomcat-8.0-doc/config/http.html) 中是这么说的:

URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, UTF-8 will be used unless the org.apache.catalina.STRICT_SERVLET_COMPLIANCE system property is set to true in which case ISO-8859-1 will be used.

那么也就意味着,从tomcat8.0开始,get请求中的中文参数,不需要特殊处理了。而如果是tomcat8之前的项目要迁移到tomcat8上面来,则也需要特殊注意这个问题,可能要删减代码中响应乱码的处理模块了。

时间: 2024-08-02 10:58:36

Servlet处理get请求时的中文乱码问题的相关文章

pyhon/excel python导出到excel时的中文乱码问题

昨儿利用python+win32com将网页的表单导出到本地excel,遇到了输出乱码问题,解决方法: 将x改为x.decode('utf-8') setCall('sheet1',row,col,x.decode('utf-8')) 我的部分源码: self.xlBook = self.xlApp.Workbooks.Add() def setCell(self,sheet,row,col,value):#设置单元格的数据 "Set value of one cell" sht =

关于struts2中表单提交时,中文乱码问题的解决

http://blog.csdn.net/hjw506848887/article/details/8966194 今天写项目时,突然遇到了struts2中表单提交的中文乱码问题,调了好久就是不知道答案. 下面的我的jsp页面: [html] view plaincopyprint? <form action="indexAction.action"> <input name="dimName" type="text" />

springmvc配置一:ajax请求防止返回中文乱码配置说明

Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里. Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入res

http请求中的中文乱码问题

通过浏览器访问服务器页面和资源时,不可避免地要传送中文字串,如果客户机与服务器不能用同一码表解析字串,肯定会出现各种各样的乱码问题.我总结了几个乱码场景及解决办法,如下 1.服务器上的中文字串被客户端访问时出现的乱码问题 原因:浏览器在解析中文时,不知道该用什么码表去解析,就会用默认的gb2312去解析,肯定会出现乱码 解决办法:以什么码表写入流,在响应的请求头里就告诉浏览器用什么码表,例子使用utf-8 //告诉浏览器使用UTF-8码表解析 response.setHeader("Conten

java接受从安卓客户端发送过来的get请求时,出现乱码的解决思路及方法

今天下午遇到了这样一个感觉很常见的问题,但是度娘了N遍,却始终找不到有效的解决方法,于是乎,在苦求他人无果的情况下,研究出了一种简单有效的方法,具体实现思路如下: (1).让安卓客户端在发送get请求之前,先通过String str = URLEncode.encode(str, "utf-8");指定编码格式为UTF-8:这样安卓客户端在给服务器端发送请求时就会以UTF-8的格式发送. (2).服务器端通过request.getParameter("str");方

Intellij idea操作maven时控制台中文乱码

只留存记录 windows环境下,Intellij idea12中maven操作时,控制台中文乱码问题(编译报错或者clean install时出现的其他错误描述乱码) 在cmd中mvn中文正常显示,log4j打印日志也是ok的. 解决方法: Setting->maven->runner VMoptions: -Dfile.encoding=GB2312

get方式请求会出现中文乱码。post方式不会。

如果是要解决get方式中文乱码问题,就需要做一个拦截器,或者在web.xml做一个get请求的配置 来自为知笔记(Wiz)

jdbc连接mysql 时的中文乱码问题解决

在用 jdbc 向 mysql 数据库插入中文时出现了乱码,严格来说是通过 Hibernate.记录下搜索和查文档以后找到的解决办法. 首先要告诉数据库要插入的字符串使用的字符集,mysql 默认使用的字符集是 latin1.我要保存的字符串是 UTF-8 编码的(字符集是 Unicode),所以包含这个字段的表应该使用 UTF-8 编码.这里有几种解决办法. 在建立数据库的时候指定数据库的字符集编码,这样,这个数据库的所有表都会默认使用数据库的字符集编码.如 create database f

delphi请求http接口中文乱码问题

请求http接口的时候参数值是中文乱码: http接口一般都是由java,php以及C#开发而成的,乱码的原因也是由于编码的问题,一般传递数据的都是utf8,然后传递的时候都会urlEcode 那么delphi如何解决这个问题呢? 请看下面的实例,实例中的"哈哈"二字就是中文: procedure TClientForm.Button77Click(Sender: TObject);var paramStream: TIdMultiPartFormDataStream; vRespon