全局过滤器解决乱码

2017-03-08  本文已影响24人  扒块腹肌

1.新建一个Filter,并在web.xml中注册

//注意,filter注册需要放在servlet注册的前面,否则报错
<filter>
        <filter-name>globladecoder</filter-name>
        <filter-class>com.cskaoyan.bookStore.web.filter.GlobalDecodeFilter</filter-class>
   </filter>
   <filter-mapping>
          <filter-name>globladecoder</filter-name>
          <url-pattern>/servlet/*</url-pattern>
   </filter-mapping>

2.新建一个过滤器。并实现其dofilter方法

public class GlobalDecodeFilter implements Filter
{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException
    {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException
    {

        HttpServletRequest req = (HttpServletRequest) request;
        response.setContentType("text/html;charset=utf-8");

        //判断post和get,切记POST一定要大写
        if (req.getMethod().equals("POST"))
        { // Post这么解决
            request.setCharacterEncoding("utf-8");
            chain.doFilter(request, response);
        }
        else
        {
//包装get提交的请求数据
            HttpServletRequest request2 = new MyRequest(
                    (HttpServletRequest) request);
            chain.doFilter(request2, response);
        }

    }

    @Override
    public void destroy()
    {

    }

}

}

3.包装类实现getParameter三个API

class MyRequest extends HttpServletRequestWrapper
{

    public MyRequest(HttpServletRequest request)
    {
        super(request);
    }

    @Override
    public String getParameter(String name)
    {
//需要传进来最初的request
        String param = super.getParameter(name);
        String key = null;
        try
        {
            byte[] bytes;
            if (param != null)
            {
//解码
                bytes = param.getBytes("iso-8859-1");
                key = new String(bytes, "utf-8");
            }
        }
        catch (UnsupportedEncodingException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return key;
    }

@Override
    public Map<String, String[]> getParameterMap()
    {
        //Map
        Map<String , String[]>  permeterMap = super.getParameterMap();
        //取出map中的映射关系
          Set<Entry<String, String[]>> entrySet  = permeterMap.entrySet();
        
          //遍历entrySet 取出键值对
          for (Entry<String, String[]> entry : entrySet)
        {
            String[] values = entry.getValue();
           for (String string : values)
            {
                try
                {
                    //逐个遍历key的valu值,立即解码
            byte[] bytes = string.getBytes("ISO-8859-1");
                    string = new String(bytes, "utf-8");
                }
                catch (UnsupportedEncodingException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return permeterMap;
    }

    @Override
    public String[] getParameterValues(String name)
    {
        //数组
        //拿到包含参数的key和value的map
        Map<String, String[]> permeterMap = getParameterMap();
        //通过传进来的key拿到参数值数组(checkbox)
        String[] strings = permeterMap.get(name);   
        return strings;
    }

以后无论是get或者post方式的getParameter的时候都不需要再编码解码了

上一篇下一篇

猜你喜欢

热点阅读