使用Filter 解决Servet的乱码问题

1\使用HttpServletRequestWrapper 包装类

2\重写getParameter \ getParameterValues \ getParameterMap 三个函数

3\ 配置 web.xml


核心过滤器代码


package com.gyarmy.demo4;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Set;

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;


public class UTFFilter implements Filter {

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

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		
		// 要解决乱码 --- 能不能  自定义 一个包装类, 去包装这个 request 对象, 
		
		MyHttpServletRequestWrapper myrequest = new MyHttpServletRequestWrapper(request);	
		chain.doFilter(myrequest, response);  //放行 , 目标资源会得到 执行
		
	}

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

	}

}


class MyHttpServletRequestWrapper extends HttpServletRequestWrapper{

	private HttpServletRequest request;

	public MyHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
		this.request = request;
	}
	
	@Override
	public String getParameter(String name) {
		
		Map<String,String[]> map = getParameterMap();
		//获得对应  values 数组 
		String[] values = map.get(name);
		
		if(values!=null){
			
			//返回数组的第一个元素 
			return values[0];
		}
		return null;
	}
	
	@Override
	public String[] getParameterValues(String name) {
		Map<String,String[]> map = getParameterMap();
		//获得对应  values 数组 
		String[] values = map.get(name);
		return values;
	}
	
	//默认的是false, 表示没有 被 解码 过 
	private boolean hasBeenEncoded= false;
	
	@Override
	public Map getParameterMap() {
		
		//只有 get 和post 
		
		//获得请求 方式
		String method = request.getMethod();
		
		if("post".equalsIgnoreCase(method)){
			
			//如果 进来,表示 是post请求方式
			
			try {
				request.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}else{
			
			//说明是get 
			
			//拿到 现有的乱码的 map 
			Map<String,String[]> map = request.getParameterMap();
			
			//遍历 map 
			Set<String> keys = map.keySet();
			
			// 乱码的本质 原因是, 这里 的 for 循环里的逻辑 被重复的调用了, 正常的情况下, 应该是只 调用一次, 就会解决乱码
			// 如何确保这里 的for循环里的 代码 只被 调用一次  
			
			
			//这里 定义 布尔值, 实现 代码 只被 调用一次, 是实际开发过程中,非常 常用的.  (技巧性的代码)
			if(!hasBeenEncoded){
				hasBeenEncoded = true;
			
				for (String key : keys) {
					//乱码的 
					String[] values = map.get(key);
					for (int i = 0; i < values.length; i++) {
						
						try {
							System.out.println("之前: " + values[i]);
							values[i] = new String(values[i].getBytes("ISO8859-1"),"UTF-8");
							System.out.println("之后: " + values[i]);
						} catch (UnsupportedEncodingException e) {
							e.printStackTrace();
						}
					}
				}
			}
			return map;
		}
		return super.getParameterMap();
	}
	
}




原文链接: 使用Filter 解决Servet的乱码问题 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-86.html )

发表评论

0则评论给“使用Filter 解决Servet的乱码问题”