过滤器四:案例-字符集过滤器;(设置请求与响应的编码,以过滤器的方式解决中文乱码)

字符集过滤器:解决web应用中的中文乱码问题。

(1)这是一个过滤器完整案例;(2)展示使用过滤器的方式解决中文乱码的问题;(3)可以发现,过滤器的作用不仅仅局限于“拦截,筛查”,过滤器也可以完成很多其他种类的功能,即过滤器可以在“拦截”一个请求(或响应)后,对这个请求(或响应)进行其他的处理后再予以放行

目录

一:问题阐述

二:开始开发

1.编写CharacterEncodingFilter类,实现Filter接口,编写doFilter方法,作为字符集过滤器:

2.配置过滤器(和以前介绍的一样啦)

3.编写完成,开始测试:


一:问题阐述

对于中文乱码问题:在Servlet请求与响应中文乱码问题这篇博客中有详细介绍。

上面几种解决方案中,都需要按照一定的规则去配置或者编写代码;而万一代码写错了,都会出现中文乱码问题,所以,为了应对这种可能出错的问题,字符集过滤器应运而生。

字符集过滤器作用就是对所有请求进行前置处理,将请求与响应中的字符集进行一个统一的设置,如此一来,在使用Servlet开发的时候就不需要再写上图中2、3两句话,这样可以极大降低程序员出错的风险。


二:开始开发

1.编写CharacterEncodingFilter类,实现Filter接口,编写doFilter方法,作为字符集过滤器:

CharacterEncodingFilter

          注:

              (1)因为这个过滤器是基于HTTP请求来进行的,所以在编写doFilter()方法体的时候,需要将ServletRequest这个顶层接口强制转成HttpServletRequest;

              (2)get请求的中文乱码,Tomcat8.x已经解决了,所以doFilter()方法中没有处理;doFilter()方法中只处理了post请求和响应的编码方式;

              (3)这个例子也印证了过滤器简介这篇博客中,“过滤器执行过程”部分中所说的:请求会走一遍过滤器,响应也会走一遍过滤器

package com.imooc.filter;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharacterEncodingFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	/*
	 * doFilter方法的参数是ServletRequest类型,而不是HttpServletRequest类型,需要强转一下;
	 * so,为什么doFilter方法的参数为什么不设置成HttpServletRequest类型呐?
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 因为这个过滤器是基于HTTP请求来进行的,所以需要将ServletRequest转成HttpServletRequest
		HttpServletRequest req = (HttpServletRequest)request;
		req.setCharacterEncoding("UTF-8");
		HttpServletResponse res = (HttpServletResponse)response;
		res.setContentType("text/html;charset=UTF-8");
		
		chain.doFilter(request, response);
		
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

那么,为什么,doFilter方法中的参数不直接设置成HttpServletRequest呐?

当每一个从客户端向服务器发来的请求数据,由RequestFacade类进行解析;所以,只要使用的是Tomcat,见到HttpServletRequest接口的时候,就需要明白,底层是由RequestFacade类来进行的处理;如果使用的不是Tomcat,自然底层实现HttpServletRequest接口的就是其他类了;

ServletResponse接口和HttpServletResponse接口同理。

……………………………………………………

2.配置过滤器(和以前介绍的一样啦)

3.字符集过滤器编写完成,开始测试:

启动应用后,访问这个Servlet,浏览器显示结果:发现编写的字符集过滤器解决了中文乱码问题。

猜你喜欢

转载自blog.csdn.net/csucsgoat/article/details/114267499
今日推荐