web的工程中,有时会遇到编码的错误,在这儿就写一下我读到的问题,以及解决方法。
解决方法1:加入过滤器。
步骤: 定义一个过滤器,并在web.xml中声明。(假如你没有用到spring架构)
(如果你用到了Spring架构,则就不需要定义一个过滤器,因为spring自身会有一个过滤器,只需要在web.xml中引用就可以了)
过滤器如下:
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;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig=filterConfig;
this.encoding=filterConfig.getInitParameter("encoding");
String value=filterConfig.getInitParameter("ignore");
if(value==null)
this.ignore=true;
else if(value.equalsIgnoreCase("true"))
this.ignore=true;
else
this.ignore=false;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null)
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
在web.xml中引用(没有用到spring时的web.xml配置)
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.common.util.SetCharacterEncodingFilter</filter-class> <!-- 变量设置,将SetCharacterEncodingFilter类中的变量进行设置,系统将自动将变量赋值 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter>
(spring的配置)
因为spring中自带过滤器,所以仅需要在web.xml中引用就可以了
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
但是有的时候,即使是配置了过滤器,仍然有乱码。这时就需要配置tomcat了
解决方法2:配置tomcat。
在tomcat的service.xml中的Connector节点,加入一句话:useBodyEncodingForURI="true" URIEncoding="UTF-8"
举例:(最后一句话)
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>
这样,大部分的中文乱码均可以解决了。