Filter 用过滤器的方式解决post和get提交乱码问题

post和get

post:请求发送时,jsp的内容以jsp页面设置的编码方式发送。
get:是在url地址中发送,jsp页面设置的编码方式没作用,只能是web容器默认的编码方式进行编码。

post乱码问题

在请求发送时,设置编码格式。

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf");
		//设置响应的编码格式必须编写在标准输出流的前面,后面不起作用
		response.setContentType("text/html;charset=utf-8");
		chain.doFilter(request, response);

	}

get乱码问题

当我们不能修改web容器的编码格式时,可以对request请求进行装饰,达到我们想要的结果。这里必须了解装饰者设计模式(不修改被装饰者的原有内容,只对被装饰者添或增强单一的功能)。
request请求是把请求中的参数放到一个map中,以get方式发送请求的时候,放到map中值就是乱码了,我们可以把原先的map值编码,然后重写解码到一个新的map中。就可以解决乱码问题了。

1.基类
request中有默认实现的基类HttpServletRequestWrapper。
2.装饰者(继承基类实现特殊功能)

package com.java.decorator;

import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Vector;

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

public class CustomRequest extends HttpServletRequestWrapper{
	//获取基类对象
	public CustomRequest(HttpServletRequest request) {
		super(request);
	}
	@Override
	public Map<String, String[]> getParameterMap() {
		// TODO Auto-generated method stub
		//创建新的map
		Map<String, String[]> newMap = new HashMap<String, String[]>();
		//获取原先的map
		Map<String, String[]> oldMap = super.getParameterMap();
		
		try {
		//遍历原先的map
			for(String key:oldMap.keySet()){
				String values[] = oldMap.get(key);
				for(int i=0;i<values.length;i++){
				//对原先的map进行编码和解码
					byte[] bytes = values[i].getBytes("utf-8");
					values[i] = new String(bytes,"utf-8");
				}
				//放到新的map
				newMap.put(key, values);
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		//返回新的map
		return newMap;
	}
	@Override
	public Enumeration<String> getParameterNames() {
		Map<String, String[]> map = this.getParameterMap();
		Set<String> keySet = map.keySet();
		//keySet中不能返回Enumeration,强转为Vector 
		Vector ketVector = (Vector) keySet;
		return ketVector.elements();
	}
	@Override
	public String getParameter(String name) {
		// TODO Auto-generated method stub
		
		return  this.getParameterValues(name)[0];
	}
	@Override
	public String[] getParameterValues(String name) {
		// TODO Auto-generated method stub
		Map<String, String[]> map = this.getParameterMap();
		return map.get(name);
	}
	
}

3.将request进行装饰

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		//传递被装饰者对象获取增强后的对象
		request = new CustomRequest((HttpServletRequest) request);
		response.setContentType("text/html;charset=utf-8");
		chain.doFilter(request, response);

	}
发布了114 篇原创文章 · 获赞 8 · 访问量 5473

猜你喜欢

转载自blog.csdn.net/OVO_LQ_Start/article/details/105012882