filter解决全局中文乱码问题

解决思路:

使用适配器模式对产生乱码的方法进行增强

1、filter中将request转换成增强后有request

package cn.itcast.crm.web.filter;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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;
 
/**
 * 通用编码解决方案
 * 
 */
public class EncodingFilter implements Filter {
	@Override
	public void destroy() {
	}
 
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// 转型为与协议相关对象
		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
		// 对request包装增强
		HttpServletRequest myrequest = new MyRequest(httpServletRequest);
		chain.doFilter(myrequest, response);
	}
 
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
 
}

2、使用适配器模式自定义的增强的request类

// 自定义的增强request类
class MyRequest extends HttpServletRequestWrapper {
 
	private HttpServletRequest request;
 
	private boolean hasEncode;
 
	public MyRequest(HttpServletRequest request) {
		super(request);// super必须写
		this.request = request;
	}
 
	// 对需要增强的方法进行覆盖
	@Override
	public Map getParameterMap() {
		// 先获得请求方式
		String method = request.getMethod();
		if (method.equalsIgnoreCase("post")) {
			// post请求
			try {
				// 处理post乱码
				request.setCharacterEncoding("utf-8");
				return request.getParameterMap();
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		} else if (method.equalsIgnoreCase("get")) {//tomcat8.5已经处理了get中文可以将get中的代码注释掉
			// get请求
			Map<String, String[]> parameterMap = request.getParameterMap();
			if (!hasEncode) { // 确保get手动编码逻辑只运行一次
				for (String parameterName : parameterMap.keySet()) {
					String[] values = parameterMap.get(parameterName);
					if (values != null) {
						for (int i = 0; i < values.length; i++) {
							try {
								// 处理get乱码
								values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
							} catch (UnsupportedEncodingException e) {
								e.printStackTrace();
							}
						}
					}
				}
				hasEncode = true;
			}
			return parameterMap;
		}
 
		return super.getParameterMap();
	}
 
	@Override
	public String getParameter(String name) {
		Map<String, String[]> parameterMap = getParameterMap();
		String[] values = parameterMap.get(name);
		if (values == null) {
			return null;
		}
		return values[0]; // 取回参数的第一个值
	}
 
	@Override
	public String[] getParameterValues(String name) {
		Map<String, String[]> parameterMap = getParameterMap();
		String[] values = parameterMap.get(name);
		return values;
	}
 
}

3、web.xml中将filter的url-patten配置成全局/*

  <filter>
  	<filter-name>EncondeFilter</filter-name>
  	<filter-class>web.EncondeFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>EncondeFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

4、另一种增强request的方式

package com.thw.web.filter;

import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.catalina.util.ParameterMap;

public class EnhancedRequest extends HttpServletRequestWrapper {

	public EnhancedRequest(HttpServletRequest request) {
		super(request);
		// TODO Auto-generated constructor stub
	}
	//重写需要增强的方法即可
	@Override
	public String getParameter(String name) {
		//获得乱码
		String luanma = this.getRequest().getParameter(name);
		if(luanma!=null){//防止类似于checkbox不勾选的null值
			String fluanma = null;
			try {
				fluanma = new String(luanma.getBytes("iso8859-1"),"utf-8");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return fluanma;
		}else{
			return luanma;
		}
	}
	protected ParameterMap<String, String[]> parameterMap = new ParameterMap<String, String[]>();
	@Override
	public Map<String, String[]> getParameterMap() {
		//重写了底层的getParameterMap的业务逻辑,目的是调的getParameterValues方法是我重写的解决中文乱码问题的该方法。
		 if (parameterMap.isLocked()) {
	            return parameterMap;
	        }
	        Enumeration<String> enumeration = getParameterNames();
	        while (enumeration.hasMoreElements()) {
	            String name = enumeration.nextElement();
	            String[] values = getParameterValues(name);
	            parameterMap.put(name, values);
	        }
	        parameterMap.setLocked(true);
	        return parameterMap;
	}
	
	//getParameterMap是通过getParameterValues方法来往map填充值,因此把getParameterValues进行增强,
	//那么getParameterMap得到的就是非乱码。
	@Override
	public String[] getParameterValues(String name) {
		String[] values = this.getRequest().getParameterValues(name);
		String[] values_new = new String[values.length];
		if(values!=null){
			//values_new数组里存放的都是非乱码
			for (int i = 0; i < values_new.length; i++) {
//				values_new[i] = values[i]
				if(values[i]!=null){//如果值不是空,才转码
					try {
						values_new[i] = new String(values[i].getBytes("iso8859-1"),"utf-8");
					} catch (UnsupportedEncodingException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}else{
					values_new[i] = values[i];
				}
			}
			return values_new;
		}else{
			return values;
		}
		
	}
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值