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();
}
}