Servlet过滤器实现统一编码

2020-03-07  本文已影响0人  微笑的鱼23333

在开发 Web 项目时,解决中文乱码问题是不可避免的。在前面所学的知识中,解决乱码的通常做法是在 Servlet 程序中设置编码方式,但是,当多个 Servlet 程序都需要设置编码方式时,就会书写大量重复的代码。

为了解决这一问题,我们可以在 Filter 中对获取到的请求和响应消息进行编码处理,这样就可以实现全站编码方式的统一。本节将分步骤演示如何使用 Filter 实现全站编码的统一。

创建过滤器

创建一个名称为 CharacterFilter 的 Filter 类,该类用于拦截用户的请求访问,并实现全站编码的统一,其具体实现代码如下所示:

public class CharacterFilter implements Filter {
    public void init(FilterConfig fConfig) throws ServletException {
    }

    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        // 拦截所有的请求,解决全站中文乱码,指定request和response的编码
        request.setCharacterEncoding("utf-8"); // 只对消息体有效
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

修改配置文件web.xml

在 CharacterFilter 中,针对请求的方式不同,采用了不同的乱码解决方式。其中,由于 POST 方式的请求参数存放在消息体中,所以通过 setCharacterEncoding() 方法进行设置,而 GET 方式的请求参数存放在消息头中,通过 HttpServletRequestWrapper 类对 HttpServletRequest 类进行包装,并通过重写 getParameter() 的方式设置 GET 方式提交参数的编码。

需要注意的是,由于要拦截用户访问资源的所有请求,因此需要将 CharacterFilter 映射信息中 <filter-mapping> 元素拦截的路径设置为“/*”,如下所示:

<filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.example.filter.CharacterFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
上一篇 下一篇

猜你喜欢

热点阅读