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(); } }
0则评论给“使用Filter 解决Servet的乱码问题”