【Filter】CharacterEncodingFilter解决JavaWeb项目POST提交造成的中文乱码

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;

public class CharacterEncodingFilter implements Filter 
{

	protected String encoding = null;

	protected FilterConfig filterConfig = null;

	protected boolean ignore = true;

	public void init(FilterConfig filterConfig) throws ServletException 
	{
		this.filterConfig = filterConfig;
		this.encoding = filterConfig.getInitParameter("encoding");
		String value = filterConfig.getInitParameter("ignore");
		if (value == null)
			this.ignore = true;
		else if (value.equalsIgnoreCase("true"))
			this.ignore = true;
		else if (value.equalsIgnoreCase("yes"))
			this.ignore = true;
		else
			this.ignore = false;

	}

	protected String selectEncoding(ServletRequest request) 
	{
		return (this.encoding);
	}

	public void destroy() 
	{

		this.encoding = null;
		this.filterConfig = null;

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException 
	{

		if (ignore || (request.getCharacterEncoding() == null)) 
		{
			String encoding = selectEncoding(request);
			if (encoding != null)
			{
				//核心代码, r
				request.setCharacterEncoding(encoding);
			}
		}

		chain.doFilter(request, response);
	}

}

1、request.setCharacterEncoding

1)设置从request中取得的值时使用的编码。

2)该过滤器只能处理POST提交造成的中文乱码,对GET提交造成的中文代码无效。

POST请求分析:表单提交,浏览器根据当前页面编码方案对数据进行编码(页面编码方案可以通过pageEncoding属性进行设置,例如pageEncoding="UTF-8"),如果不调用request.setCharacterEncoding设置解码方案,那么则默认使用"ISO-8859-1"对数据进行解码,所以造成中文乱码。

POST请求的解码机制:在第一次调用request.getParameter时,tomcat根据request.setCharacterEncoding设置好的解码方案对所有数据进行解码,而后续调用request.getParameter则不再进行解码,所以必须在第一次调用request.getParameter之前, 必须调用request.setCharacterEncoding进行解码方案设置。

GET请求中文乱码解决方案:需要在Tomcat的server.xml中配置,添加属性 URIEncoding="UTF-8"解决GET提交乱码问题。代码如下:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" 
redirectPort="8443" URIEncoding="UTF-8"/>

GET请求的解码机制:众所周知,GET提交的内容会显示在浏览器URL中,以ASCII字符形式进行数据传输,到了tomcat中,会根据server.xml中设置的URIEncoding指定的解码方案进行解码。由于tomcat知道GET提交的数据早就进行了解码,所以调用request.getParameter时就不会再对数据进行解码,所以request.setCharacterEncoding自然就无效。

2、response.setCharacterEncoding

response.setContentType:设置HTTP响应的编码,同时通知浏览器显示时使用的编码。

response.setCharacterEncoding:设置HTTP响应的编码,如果之前使用了response.setContentType设置了编码方案,则可以使用response.setCharacterEncoding覆盖之前的设置,这两个方法,必须在reponse提交之前或者response.getWriter之前调用。否则无效。

时间: 2025-01-01 21:01:16

【Filter】CharacterEncodingFilter解决JavaWeb项目POST提交造成的中文乱码的相关文章

提交数据的中文乱码的解决方法

使用GET方式提交数据的中文乱码的解决方法: 使用URLEncoder.encode(name,"UTF-8")进行url编码:      String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(

解决loadrunner 脚本和replaylog中的中文乱码问题

解决loadrunner 脚本和replaylog中的中文乱码问题 解决这个问题必须认识到一个事实就是,loadrunner和测试服务器交换数据使用的是utf8格式,但是展现在replaylog中是使用gb2312格式,而且在脚本中如何使用web_reg_find的时候也是使用的是gb2312格式,所以知道这个原理后,事情就好办多了. 1.获取测试服务器提供的utf8格式的文字并且转换成gb2312格式展现出来 web_reg_save_param_ex( "ParamName=aa"

解决ubuntu中zip解压的中文乱码问题

在解压windows传过来的zip文件时,才会出现乱码.所以,我用另一个方法解决中文乱码问题. 安装 代码: sudo apt-get install unar 12.04以下或者想编译安装的朋友请参考: 使用 代码: lsar foo.zip #列出所有文件 如果列出的文件名已经正确 代码: unar foo.zip #解压所有文件 如果列出的文件名还不正确 代码: lsar -e GB18030 foo.zip #指定使用GB18030编码列出所有文件 unar -e GB18030 foo

解决docker容器中Centos7系统的中文乱码

解决docker容器中Centos7系统的中文乱码问题有如下两种方案: 第一种只能临时解决中文乱码: 在命令行中执行如下命令: $>localedef -i zh_CN -f UTF-8 zh_CN.UTF-8 $>yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common $>localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 $>export LC_ALL=zh

关于struts2中表单提交时,中文乱码问题的解决

http://blog.csdn.net/hjw506848887/article/details/8966194 今天写项目时,突然遇到了struts2中表单提交的中文乱码问题,调了好久就是不知道答案. 下面的我的jsp页面: [html] view plaincopyprint? <form action="indexAction.action"> <input name="dimName" type="text" />

项目中get/post请求中文乱码的解决方案

一.解决get请求中文乱码的方案: 方案(推荐)1: 一般情况下tomcat(8之前)服务器的编码默认是ISO8859-1,所以要对get请求提交的参数进行重新编码: String userName = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8"); 方案(不推荐)2: 既然知道了tomcat服务器的编码默认是ISO8859-1,那么可以修改to

将Eclipse项目导入Android Studio出现中文乱码的问题

以前一直以Eclipse开发项目,最近正在研究Android Studio的使用,首先想到到的是将Eclispe项目导入AS. 可以方便查看以前写过的代码,然后出现了中文乱码的问题,通过搜索了一些资料,找到了解决方法. 解决方法为如下四步: 1.点击AS右下角的 File Encoding UTF-8,选择GBK. 2.在出现的对话框中选择Reload-> Reload anyway,此时中文乱码消失,改为中文. 3.点击AS右下角的 File Encoding GBK,选择UTF-8. 4.在

SpringMVC以POST提交表单中文乱码解决方案。

在web.xml中添加字符集过滤器: <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name&g

java项目连接数据库(oracle)中文乱码问题解决方法

今天写了一个java项目连接数据库,之后写了一个执行入库操作的模块.此时暴露出一个问题就是项目的中文插入到数据库时会是乱码: 项目输出的中文: 执行插入操作后数据库中内容: 此时CustomerNumber字段是乱码. 出现这种情况一般都是数据库编码与项目编码不一致导致的,首先查看项目与数据库的编码格式: 查看项目编码: 项目的编码是gbk格式 查看数据库编码格式: 数据库编码格式是ISO-8859-1 以上查看编码格式操作可以百度 出现这种情况一般可以通过两种方式解决.一是修改数据库或者项目的