← 返回首页
Servlet基础教程(十八)
发表时间:2020-04-08 18:11:07
讲解过滤器解决中文乱码。

1.出现中文乱码的原因

在上节中,我们提交表单后发现Servlet里面接收的中文数据存在中文乱码现象。在java web开发中出现的中文问题无外乎是以下几种情况造成的:

根据我们分析,得知上节出现的中文乱码是tomcat服务器本身设置问题。如果,我们换成jetty服务器,重写运行上节案例,就不会出现中文乱码现象。

比如:把项目部署到jetty服务器后,启动填写如下表单:

控制台输出结果如下:

********注册用户资料*********
Users{username='zhangsan', password='123456', email='zhangsan@126.com', salary=10000.0, gender='F', education=6, province='山东', birthday=Wed Mar 15 00:00:00 CST 1995, favorites=[internet, nba], introduce='程序猿', accept='true'}

2.Filter解决中文乱码

那么对于使用Tomcat服务器,以post方式提交表单时的中文乱码如何解决呢?我们推荐使用过滤器解决。

过滤器(Filter),顾名思义就是过滤用的,它可以在请求、响应、或者servlet中请求转发等操作发生时先进行执行,之后程序再往下执行,这里起到一个对request/response过滤的作用。

实现过程:

1)创建com.filter包,编写EncodingFilter过滤器类。

package com.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import java.io.IOException;

@WebFilter(displayName = "EncodingFilter",value="/*",initParams ={@WebInitParam(name="encoding",value="utf-8")})
public class EncodingFilter implements Filter {

    private String encoding = null;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       this.encoding = filterConfig.getInitParameter("encoding");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding(this.encoding);
        servletResponse.setCharacterEncoding(this.encoding);
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

2)测试过滤器 启动tomcat服务器,填写注册表单如下:

点击注册提交按钮后,控制台输出效果如下:

********注册用户资料*********
Users{username='张三丰', password='123456', email='zhangsanfeng@126.com', salary=10000.0, gender='M', education=5, province='陕西', birthday=Tue Apr 16 00:00:00 CST 1996, favorites=[internet, nba], introduce='程序猿', accept='true'}

3)xml配置

也可以在web.xml中配置过滤器。

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.filter.EncodingFilter</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服务器使用get方式提交数据出现的中文乱码现象,要具体问题具体分析,不能一概而论。但是通常的做法是在server.xml中配置 URIEncoding="UTF-8"。