代码改变世界

tomcat服务器中文乱码问题集锦(servlet/jsp中文乱码)

2011-09-26 00:38  clarkhan  阅读(305)  评论(0编辑  收藏  举报

现在将常见的乱码问题分为JSP页面显示中文乱码、表单提交乱码两类。

1)JSP页面中显示中文乱码

     在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%>

2)表单提交乱码

     表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
    (1)POST处理
    对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:

 

在当前应用下新建~~

Java代码 收藏代码

  1. package example.util; 
  2. import java.io.IOException; 
  3. import javax.servlet.Filter; 
  4. import javax.servlet.FilterChain; 
  5. import javax.servlet.FilterConfig; 
  6. import javax.servlet.ServletException; 
  7. import javax.servlet.ServletRequest; 
  8. import javax.servlet.ServletResponse; 
  9. public class SetCharacterEncodingFilter implements Filter { 
  10. protected String encoding = null; 
  11. protected FilterConfig filterConfig = null; 
  12. protected boolean ignore = true; 
  13. public void destroy() { 
  14. this.encoding = null; 
  15. this.filterConfig = null; 
  16.      } 
  17. public void doFilter(ServletRequest request, ServletResponse response,  
  18. FilterChain chain) throws IOException, ServletException { 
  19. if (ignore || (request.getCharacterEncoding() == null)) { 
  20.        String encoding = selectEncoding(request); 
  21. if (encoding != null) { 
  22.         request.setCharacterEncoding(encoding); 
  23.        } 
  24.       }     
  25. // Pass control on to the next filter
  26.       chain.doFilter(request, response); 
  27.      } 
  28. public void init(FilterConfig filterConfig) throws ServletException { 
  29. this.filterConfig = filterConfig; 
  30. this.encoding = filterConfig.getInitParameter("encoding"); 
  31.       String value = filterConfig.getInitParameter("ignore"); 
  32. if (value == null) { 
  33. this.ignore = true; 
  34.       } else if (value.equalsIgnoreCase("true")) { 
  35. this.ignore = true; 
  36.       } else if (value.equalsIgnoreCase("yes")) { 
  37. this.ignore = true; 
  38.       } else { 
  39. this.ignore = false; 
  40.       } 
  41.      } 
  42. protected String selectEncoding(ServletRequest request) { 
  43. return (this.encoding); 
  44.      } 
  45.     } 

        在当前应用目录下的  web.xml文件中<display-name></display-name>    之后加入过滤器

 

  1. <filter>
  2. <filter-name>Encoding</filter-name>
  3. <filter-class>
  4.             example.util.SetCharacterEncodingFilter 
  5. </filter-class>
  6. <init-param>
  7. <param-name>encoding</param-name>
  8. <param-value>utf-8</param-value>
  9. <!--gbk或者gb2312或者utf-8-->
  10. </init-param>
  11. <init-param>
  12. <param-name>ignore</param-name>
  13. <param-value>true</param-value>
  14. </init-param>
  15. </filter>
  16. <filter-mapping>
  17. <filter-name>Encoding</filter-name>
  18. <servlet-name>/*</servlet-name>
  19. </filter-mapping>

(2) Get方法的处理
tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
打开<tomcat_home>\conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:

  1. <Connector port="8080" maxHttpHeaderSize="8192"
  2.                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
  3.                enableLookups="false" redirectPort="8443" acceptCount="100"
  4.                connectionTimeout="20000" disableUploadTimeout="true"
  5. URIEncoding="utf-8" /> 

  * 注意修改后重新启动tomcat才能起作用。