2009年3月3日星期二

解决JSP的Post和Request中文乱码--

1.过滤器(Filter)

import javax.servlet.*;
import javax.servlet.http.*;

public class CharsetFilter implements Filter
{
public void destroy()
{

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
{
try
{
HttpServletRequest httpRequest = (HttpServletRequest)request;
String method = httpRequest.getMethod().toLowerCase();
if(method.equals("post"))
{
//如果是post,即表单方法,直接设置charset即可
request.setCharacterEncoding("UTF-8");
}
else if(method.equals("get"))
{
//如果是get方法
request.setCharacterEncoding("UTF-8");
request = new HttpServletRequestWrapper((HttpServletRequest)request)
{
public String getParameter(String str)
{
try
{
return new String(super.getParameter(str).getBytes("iso-8859-1"),"GBK");
}
catch(Exception e)
{
return null;
}

}
};


}

chain.doFilter(request, response);
}
catch(Exception e){}
}

public void init(FilterConfig filterConfig)
{

}
}

过滤器配置:

<filter>
<filter-name>CharFilter</filter-name>
<filter-class>CharsetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>

2.配置Tomcat的server.xml

一、请求结果的乱码:

  • POST提交:

   

解决办法:在显示中文字符串前加上 request.setCharacterEncoding("gbk");

或者:在获取字符串str后使用str = new String(str.getBytes("ISO-8859-1"),"GB2312");转换

ISO-8859-1是默认的字符编码

  • GET提交:

   解决办法:

1、项目已打包到web服务器:

  找到 %TOMCAT_HOME%\conf\server.xml文件,将此文件的代码段末尾加入 URIEncoding="gbk",结果如下所示:

<Connector port="8080" maxHttpHeader maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gbk"/>

2、开发过程中:

找到 %project_name%\Tomcat\conf\server.xml文件,删除文件中的备注,增加URIEncoding="gbk",结果如下所示:

<Connector acceptCount="10" connectionTimeout="60000" maxThreads="75" minSpareThreads="5" port="8080" URIEncoding="gbk"/>

二、处理响应结果的乱码..

1.在servlet中 response.setContentType("text/html;charset=GB2312");

2.在jsp中 <%@page contentType="text/html;charset=GB2312"%>

3.在html中 <head><META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=GB2312"></head>

对于TOMCAT服务器而言,对于中文需要注意:

1、 对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。

2、 正确设置JSP的pageEncoding参数

3、 在所有的JSP/Servlet中设置contentType="text/html;charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。

4、 对于请求,可以使用过滤器或者在每个JSP/Servlet中设置request.setCharacterEncoding("UTF-8")。同时, 要修改Tomcat的默认配置,推荐将useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为 UTF-8(有可能影响其他应用,所以不推荐)。

没有评论: