Struts2中解决POST请求和GET请求中的中文乱码问题

来源:互联网 发布:恋爱试用期知乎 编辑:程序博客网 时间:2024/04/18 21:05
 java语言虽然天生支持国际化语言,但在项目实践中仍然会遇到中文乱码问题。

Struts2提供的默认过滤器虽然可在一定程度上支持编码处理,但过滤器的配置不当或JSP页面编码不当,中文乱码问题仍会出现。

最新的Tomcat(包括Tomcat6及以上版本)在对待POST请求和GET请求时的处理方式并不一致,请注意。

环境:Tomcat6.0 + MySQL 5 + Struts2        

编码:UTF-8

1.MySQL数据库编码

   对于MySQL中新创建的数据库采用UTF-8编码

 

2.Tomcat服务器设置

  在server.xml文件中配置Connector标签下的URIEncoding,server.xml在conf目录下
<connector connectiontimeout="20000"
          port="8080" protocol="HTTP/1.1" redirectport="8443" uriencoding="UTF-8">
</connector>

 

3.JSP页面编码
<%@ page language="jsp" import="java.util.*" pageEncoding="UTF-8"  
    contentType="text/html; charset=UTF-8"%>

注意:pageEncoding和charset需要同时设置

 

4.在web.xml文件中配置struts2和编码相关的拦截器
<filter>  
    <filter-name>struts-cleanup</filter-name>  
    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>struts-cleanup</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

注意:这个拦截器要放置在默认拦截器之前才能对编码生效。

如果实现了以上4步基本就可以解决Struts2项目中的GET请求(不包括客户端Ajax的GET请求,如何处理Ajax请求中的乱码问题,请参考下篇博客)

对于POST请求,最常用的方法就是编写过滤器在过滤器中进行编码,接下来看如何使用过滤器来处理POST请求。

 

5.编写过滤器

假设过滤器类名为CharsetEncodingFilter,在filter的doFilter()方法中设置编码。encoding是filter配置中的参数,值是UTF-8。
@Override  
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,  
        FilterChain filterChain) throws IOException, ServletException  
{  
    HttpServletRequest request = (HttpServletRequest) sRequest;  
    HttpServletResponse response = (HttpServletResponse) sResponse;  
    // 设置字符集  
    request.setCharacterEncoding(encoding);  
    response.setCharacterEncoding(encoding);  
     
    filterChain.doFilter(request, response);  
}  
 
@Override  
public void init(FilterConfig config) throws ServletException  
{  
    encoding = config.getInitParameter(&quot;encoding&quot;);  
}

 

6.在web.xml文件中配置filter
<filter>  
    <filter-name>charsetEncoding</filter-name>  
    <filter-class>web.filter.CharsetEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>charsetEncoding</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

在这里为filter设置了一个init-param,值为UTF-8(见第5步)

在这一步需要特别注意的是fiter配置放置的位置:需要放置在第4步中编码拦截器的前面。否则的话对于POST请求仍然会出现乱码。

因而最终的顺序如下:
<filter>  
    <filter-name>charsetEncoding</filter-name>  
    <filter-class>web.filter.CharsetEncodingFilter</filter-class>  
    <init-param>  
        <param-name>encoding</param-name>  
        <param-value>UTF-8</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>charsetEncoding</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>  
 
<filter>  
    <filter-name>struts-cleanup</filter-name>  
    <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
</filter>  
<filter-mapping>  
    <filter-name>struts-cleanup</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

经过以上6步处理后即可解决POST请求中的中文乱码问题。