常见的Tomcat5表单编码提交后乱码的解决方案有很多,有改TomcatConnector属性的,有加过滤器的.但是Tomcat自带的那个过滤器只解决了POST方式的乱码却不能处理GET方式的乱码.在这里那我就给出一个不需要修改任何Tomcat配置文件的完美解决中文问题的过滤器的代码:
首先是我们的测试页面:
GET方式:
POST方式:
index.jsp
<%@pagelanguage=
"java"
import
=
"java.util.*"
pageEncoding=
"GBK"
%>
<!DOCTYPEHTMLPUBLIC
"-//W3C//DTDHTML4.01Transitional//EN"
>
<html>
<head>
<title>表单测试页面</title>
</head>
<body>
<formaction=
"action.jsp"
>
GET方式:<inputtype=textname=
"name"
value=
"GET中文"
>
<inputtype=submit>
</form>
<formaction=
"action.jsp"
method=
"POST"
>
POST方式:<inputtype=textname=
"name"
value=
"POST中文"
>
<inputtype=submit>
</form>
</body>
</html>
和普通的表单没有任何区别.
然后就是表单提交页面action.jsp:
<%@pagelanguage=
"java"
pageEncoding=
"GBK"
%>
<html>
<body>
参数:<%=request.getParameter(
"name"
)%><br>
</body>
</html>
接着是过滤器的配置文件web.xml(用
2.5
版本也可以):
<?xmlversion=
"1.0"
encoding=
"UTF-8"
?>
<web-appversion=
"2.4"
xmlns=
"http://java.sun.com/xml/ns/j2ee"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:
//java.sun.com/xml/ns/j2ee
http:
//java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>TomcatFormFilter</filter-name>
<filter-
class
>filters.TomcatFormFilter</filter-
class
>
</filter>
<filter-mapping>
<filter-name>TomcatFormFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
最后最关键的就是我们的过滤器代码了,对GET方式使用请求包装器,而POST方式则用setCharacterEncoding():
package
filters;
import
java.io.IOException;
import
javax.servlet.Filter;
import
javax.servlet.FilterChain;
import
javax.servlet.FilterConfig;
import
javax.servlet.ServletException;
import
javax.servlet.ServletRequest;
import
javax.servlet.ServletResponse;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletRequestWrapper;
import
javax.servlet.http.HttpServletResponse;
public
class
TomcatFormFilter
implements
Filter{
/**
*Request.java
*对HttpServletRequestWrapper进行扩充,不影响原来的功能并能提供所有的HttpServletRequest
*接口中的功能.它可以统一的对Tomcat默认设置下的中文问题进行解决而只需要用新的Request对象替换页面中的
*request对象即可.
*/
class
Request
extends
HttpServletRequestWrapper
{
public
Request(HttpServletRequestrequest){
super
(request);
}
/**
*转换由表单读取的数据的内码.
*从ISO字符转到GBK.
*/
public
StringtoChi(Stringinput){
try
{
byte
[]bytes=input.getBytes(
"ISO8859-1"
);
return
new
String(bytes,
"GBK"
);
}
catch
(Exceptionex){
}
return
null
;
}
/**
*ReturntheHttpServletRequestholdedbythisobject.
*/
private
HttpServletRequestgetHttpServletRequest()
{
return
(HttpServletRequest)
super
.getRequest();
}
/**
*读取参数--修正了中文问题.
*/
public
StringgetParameter(Stringname)
{
return
toChi(getHttpServletRequest().getParameter(name));
}
/**
*读取参数列表-修正了中文问题.
*/
public
String[]getParameterValues(Stringname)
{
Stringvalues[]=getHttpServletRequest().getParameterValues(name);
if
(values!=
null
){
for
(
int
i=
0
;i<values.length;i++){
values[i]=toChi(values[i]);
}
}
return
values;
}
}
public
void
destroy(){
}
public
void
doFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)
throws
IOException,ServletException{
HttpServletRequesthttpreq=(HttpServletRequest)request;
if
(httpreq.getMethod().equals(
"POST"
)){
request.setCharacterEncoding(
"GBK"
);
}
else
{
request=
new
Request(httpreq);
}
chain.doFilter(request,response);
}
public
void
init(FilterConfigfilterConfig)
throws
ServletException{
}
}