• tomcat request.getParamter() 乱码解决方案 Filter版本


    啥也不说直接上代码。

    web.xml配置如下

    <filter>
    <filter-name>encodeFilter</filter-name>
    <filter-class>cn.lhl.web.filter.EncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    </filter>

    <filter-mapping>
    <filter-name>encodeFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

    过滤器实现类如下(自定义的内部类MyGetHttpServletRequestWrapper是关键。麻烦亲们自己弄到IDE格式化啦)

    package cn.lhl.web.filter;

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;

    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;

    import org.apache.commons.lang.StringUtils;

    public class EncodingFilter implements Filter{

    //<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
    //URIEncoding未配置则为默认的ISO-8859-1 否则tomcatDefaultEncoding要与tomcat server.xml中配置保持一致
    //如果不一致的话GET中文参数值依然会乱码

    private String tomcatDefaultEncoding = "ISO-8859-1";

    private String webXmlEncoding = "UTF-8";

    @Override
    public void destroy() {}

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    // struts.i18n.encoding和request.setCharacterEncoding("UTF-8")只针对POST请求有效。对GET请求无效。
    // 所以对于GET请求必须对request.getParameter方法进行包装修改
    String method = request.getMethod();
    if ("GET".equals(method)) {
    request = new MyGetHttpServletRequestWrapper(request);
    } else if ("POST".equals(method)) {
    request.setCharacterEncoding(webXmlEncoding);
    }
    response.setCharacterEncoding(webXmlEncoding);
    chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    //web.xml中过滤器初始化参数获取
    String encoding = filterConfig.getInitParameter("encoding");
    if(StringUtils.isNotBlank(encoding)) {
    webXmlEncoding = encoding;
    }
    }

    //自定义内部类用于包装request
    private class MyGetHttpServletRequestWrapper extends HttpServletRequestWrapper {
    public MyGetHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
    }

    private String StringConverter(String oldString) {
    String newString = null;
    if (StringUtils.isNotBlank(oldString)) {
    try {
    newString = new String(oldString.getBytes(tomcatDefaultEncoding), webXmlEncoding);
    } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
    }
    return newString;
    }

    @Override
    public String getParameter(String name) {
    return StringConverter(super.getParameter(name));
    }

    @Override
    public String[] getParameterValues(String name) {
    String[] oldValueArray = super.getParameterValues(name);
    String[] newValueArray = null;
    if (oldValueArray != null && oldValueArray.length > 0) {
    newValueArray = new String[oldValueArray.length];
    for (int i = 0; i < oldValueArray.length; i++) {
    newValueArray[i] = StringConverter(oldValueArray[i]);
    }
    }
    return newValueArray;
    }
    }
    }

  • 相关阅读:
    应用程序是否能控制SDK的P2P连接?
    如何使用流媒体数据代理功能?
    怎么样设置AnyChat视频质量?
    AnyChat在打开音频设备的同时会自动发布视频数据吗?
    单层感知器--matlab神经网络
    Django Day1
    云知声Java实习面试(offer到手含面试经验及答案)
    第四范式Java实习面试(offer到手含面试经验及答案)
    悦畅科技Java实习面试(offer到手含面试经验及答案)
    花椒直播Java实习面试(offer到手含面试经验及答案)
  • 原文地址:https://www.cnblogs.com/kingsniper13/p/7289417.html
Copyright © 2020-2023  润新知