web中页面向服务器传输数据解决中文乱码过滤器(解决get、post、delete、put请求乱码问题)CharacterEncodingFilter

本文介绍了一种解决HTTP请求中中文乱码问题的过滤器实现方法,包括POST、GET、DELETE和PUT请求的处理。通过自定义过滤器CharacterEncodingFilter,能够有效解决不同请求类型下的字符编码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、在项目中创建一个filter包,然后创建一个类实现Filter接口,取名为CharacterEncodingFilter,将下面代码复制进去

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
/**
 * 中文乱码过滤器
 * 既可以处理POST乱码,又可以处理GET、DELETE、PUT乱码
 * @author 
 *
 */
public class CharacterEncodingFilter implements Filter {

	private String encoding;
	private boolean forceEncoding = false;

	public CharacterEncodingFilter() {
		// TODO Auto-generated constructor stub
	}

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

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		String method = req.getMethod();
		
		if (forceEncoding) {
			res.setCharacterEncoding(encoding);
		}
		
		if ("POST".equals(method.toUpperCase()) || "PUT".equals(method.toUpperCase())|| "DELETE".equals(method.toUpperCase())) {
			req.setCharacterEncoding(encoding);
			chain.doFilter(req, res);
		} else if ("GET".equals(method.toUpperCase())) {
			HttpServletRequest wrapper = new EncodingHttpServletRequestWrapper(req, encoding);
			chain.doFilter(wrapper, res);
		}
	}

	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		encoding = config.getInitParameter("encoding");
		forceEncoding = Boolean.valueOf(config.getInitParameter("forceEncoding"));
	}

	private static class EncodingHttpServletRequestWrapper extends HttpServletRequestWrapper {

		private HttpServletRequest request;
		private String encoding;

		public EncodingHttpServletRequestWrapper(HttpServletRequest request, String encoding) {
			super(request);
			// TODO Auto-generated constructor stub
			this.request = request;
			this.encoding = encoding;
		}

		@Override
		public String getQueryString() {
			// TODO Auto-generated method stub
			String content = request.getQueryString();

			if (content != null) {
				try {
					content = URLDecoder.decode(content, encoding);
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			return content;
		}
		
		@Override
		public Map<String, String[]> getParameterMap() {
			// TODO Auto-generated method stub
			String content = getQueryString();
			//userName=阿斯蒂芬&loginName=1223&pwd=&gender=0&income=2342342342&marry=true&birthday=&hobby=0&hobby=1
			Map<String, String[]> params = new HashMap<String, String[]>();
			// 处理多值的情况
			Map<String, List<String>> multiValues = new HashMap<String, List<String>>();
			if (content != null) {
				String[] tem = content.split("&");
				for (String str : tem) {
					String[] kvs = str.split("=");// userName=撒旦法
					// 需要处理一个提交项有多个值的情况发生
					if (params.containsKey(kvs[0])) {
						// 需要处理checkbox的多值情况,例如:ck=111&ck=222&ck=333
						List<String> valuesList;
						if (multiValues.containsKey(kvs[0])) {// 如果多值集合中已经包含某个键
							valuesList = multiValues.get(kvs[0]);
							if (kvs.length >= 2) {// ck=111
								valuesList.add(kvs[1]);
							} else {
								valuesList.add("");// ck=
							}
						} else {// 如果多值集合中尚未包含某个键
							valuesList = new ArrayList<String>();
							valuesList.add(params.get(kvs[0])[0]);// 初始加入
							if (kvs.length >= 2) {// ck=111
								valuesList.add(kvs[1]);
							} else {// ck=
								valuesList.add("");
							}
							multiValues.put(kvs[0], valuesList);
						}
					} else {
						if (kvs.length >= 2) {// userName=撒旦法
							params.put(kvs[0], new String[] { kvs[1] });
						} else {// userName=
							params.put(kvs[0], new String[] { "" });
						}
					}
				} // for循环结束

				// --------------将多值情况,同样添加到params集合中去-------------
				if (multiValues != null && !multiValues.isEmpty()) {
					Iterator<String> its = multiValues.keySet().iterator();
					while (its.hasNext()) {
						String key = (String) its.next();
						List<String> strs = multiValues.get(key);
						int size = strs.size();// 获得值的个数
						String[] arrays = new String[size];
						for (int i = 0; i < size; i++) {
							arrays[i] = strs.get(i);
						}
						params.put(key, arrays);// 将多值的情况也处理到Map集合中去
					}
				}
			}
			return params;
		}

		@Override
		public String getParameter(String name) {
			// TODO Auto-generated method stub
			Map<String, String[]> params = getParameterMap();
			String val = "";
			if (params != null && params.containsKey(name)) {
				val = params.get(name)[0];
			}
			return val;
		}

		@Override
		public Enumeration<String> getParameterNames() {
			// TODO Auto-generated method stub
			return Collections.enumeration(getParameterMap().keySet());
		}

		@Override
		public String[] getParameterValues(String name) {
			// TODO Auto-generated method stub
			return (String[]) getParameterMap().get(name);
		}
	}

}

2、在web.xml中去添加这个过滤器,在代码中<web-app></web-app>标签之间添加以下代码(修改<filter-class></filter-class>之间的路径)

  	<!-- 定义处理POST请求中文乱码过滤器 -->
  	<filter>
  		<filter-name>characterEncodingFilter</filter-name>
  		<!--过滤器类的路径,将下面的路径改成自己写的filter类的路径,下面的这个是spring框架自带的,只能解决post请求的乱码问题-->
  		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  		<init-param>
			<!--对类中的属性编码方式赋值 -->
  			<param-name>encoding</param-name>
  			<param-value>UTF-8</param-value>
  		</init-param>
  		<init-param>
			<!--forceEncoding用来设置是否理会 request.getCharacterEncoding()方法,设置为true则强制覆盖之前的编码格式-->
  			<param-name>forceEncoding</param-name>
  			<param-value>true</param-value>
  		</init-param>
  	</filter>
  	<filter-mapping>
  		<filter-name>characterEncodingFilter</filter-name>
  		<url-pattern>/*</url-pattern>
  	</filter-mapping>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值