分享一个比spring自带的Filter还强的

219 阅读1分钟

package com.lzw.Filter;

/**

  • @author lzw
  • @Description
  • @creat 2020-11-24-14:07 / import javax.servlet.; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map;

/**

  • 解决get和post请求 全部乱码的过滤器 */ public class GenericEncodingFilter implements Filter {

    public void destroy() { }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //处理response的字符编码 HttpServletResponse myResponse=(HttpServletResponse) response; myResponse.setContentType("text/html;charset=UTF-8");

     // 转型为与协议相关对象
     HttpServletRequest httpServletRequest = (HttpServletRequest) request;
     // 对request包装增强
     HttpServletRequest myrequest = new MyRequest(httpServletRequest);
     chain.doFilter(myrequest, response);
    

    }

    public void init(FilterConfig filterConfig) throws ServletException { }

}

//自定义request对象,HttpServletRequest的包装类 class MyRequest extends HttpServletRequestWrapper {

private HttpServletRequest request;
//是否编码的标记
private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
public MyRequest(HttpServletRequest request) {
    super(request);// super必须写
    this.request = request;
}

// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
    // 先获得请求方式
    String method = request.getMethod();
    if (method.equalsIgnoreCase("post")) {
        // post请求
        try {
            // 处理post乱码
            request.setCharacterEncoding("utf-8");
            return request.getParameterMap();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    } else if (method.equalsIgnoreCase("get")) {
        // get请求
        Map<String, String[]> parameterMap = request.getParameterMap();
        if (!hasEncode) { // 确保get手动编码逻辑只运行一次
            for (String parameterName : parameterMap.keySet()) {
                String[] values = parameterMap.get(parameterName);
                if (values != null) {
                    for (int i = 0; i < values.length; i++) {
                        try {
                            // 处理get乱码
                            values[i] = new String(values[i]
                                    .getBytes("ISO-8859-1"), "utf-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
            hasEncode = true;
        }
        return parameterMap;
    }
    return super.getParameterMap();
}

//取一个值
@Override
public String getParameter(String name) {
    Map<String, String[]> parameterMap = getParameterMap();
    String[] values = parameterMap.get(name);
    if (values == null) {
        return null;
    }
    return values[0]; // 取回参数的第一个值
}

//取所有值
@Override
public String[] getParameterValues(String name) {
    Map<String, String[]> parameterMap = getParameterMap();
    String[] values = parameterMap.get(name);
    return values;
}

}