zoukankan      html  css  js  c++  java
  • 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;
    }
    }
    }

  • 相关阅读:
    Git 一些常用命令
    Opengl VS2008开发环境
    用 HTML5 给 iPad,iPhone 打造速度超快的应用_HTML5研究小组
    理解CSS3 transform中的Matrix(矩阵) « 张鑫旭鑫空间鑫生活
    Google Dremel 原理 如何能 3 秒分析 1PB 开源中国社区
    Perl:过滤注释
    HTML5 History API实现无刷新跳转 蓝飞技术部落格 —— 关注前沿,追求卓越。
    OPENGL编程指南
    Perl : Quantifier follows nothing in regex; marked by
    .js文件无法运行的方法
  • 原文地址:https://www.cnblogs.com/kingsniper13/p/7289417.html
Copyright © 2011-2022 走看看