全局编码过滤器–encodingFilter
//编码过滤器
public class EncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 1.将request,response强制转换成Http协议下使用request,与response
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 2.操作--将编码问题解决
// request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 1.得到一个request装饰后的对象.
HttpServletRequest myreq=new MyRequest(request);
// 3.放行
chain.doFilter(myreq, response);
}
public void destroy() {
}
}
// 这个就是我们对request进行装饰的类
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;// 是用于接收外部传递的原始的request
public MyRequest(HttpServletRequest request) {
super(request); // 是因为父类没有无参数构造
this.request = request;
}
@Override
public String getParameter(String name) {
if (name != null) {
String[] st = (String[]) getParameterMap().get(name);
if (st != null && st.length > 0) {
return st[0];
}
}
return null;
}
@Override
public String[] getParameterValues(String name) {
if (name != null) {
return (String[]) getParameterMap().get(name);
}
return null;
}
private boolean flag = true;
@Override
public Map getParameterMap() {
// 1.得到原始的map集合
Map<String, String[]> map = request.getParameterMap();// 乱码
if (flag) {
// 2.将map集合中的String[]得到,解决每一个元素的乱码问题.
for (String key : map.keySet()) {
String[] st = map.get(key); // 得到每一个数组
for (int i = 0; i < st.length; i++) {
try {
st[i] = new String(st[i].getBytes("iso8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
flag = false;
}
return map;
}