常见的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():
packagefilters;
importjava.io.IOException;
importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletRequestWrapper;
importjavax.servlet.http.HttpServletResponse;
publicclassTomcatFormFilterimplementsFilter{
/**
*Request.java
*对HttpServletRequestWrapper进行扩充,不影响原来的功能并能提供所有的HttpServletRequest
*接口中的功能.它可以统一的对Tomcat默认设置下的中文问题进行解决而只需要用新的Request对象替换页面中的
*request对象即可.
*/
classRequestextendsHttpServletRequestWrapper
{
publicRequest(HttpServletRequestrequest){
super(request);
}
/**
*转换由表单读取的数据的内码.
*从ISO字符转到GBK.
*/
publicStringtoChi(Stringinput){
try{
byte[]bytes=input.getBytes("ISO8859-1");
returnnewString(bytes,"GBK");
}
catch(Exceptionex){
}
returnnull;
}
/**
*ReturntheHttpServletRequestholdedbythisobject.
*/
privateHttpServletRequestgetHttpServletRequest()
{
return(HttpServletRequest)super.getRequest();
}
/**
*读取参数--修正了中文问题.
*/
publicStringgetParameter(Stringname)
{
returntoChi(getHttpServletRequest().getParameter(name));
}
/**
*读取参数列表-修正了中文问题.
*/
publicString[]getParameterValues(Stringname)
{
Stringvalues[]=getHttpServletRequest().getParameterValues(name);
if(values!=null){
for(inti=0;i<values.length;i++){
values[i]=toChi(values[i]);
}
}
returnvalues;
}
}
publicvoiddestroy(){
}
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
HttpServletRequesthttpreq=(HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")){
request.setCharacterEncoding("GBK");
}else{
request=newRequest(httpreq);
}
chain.doFilter(request,response);
}
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
}