全局过滤器解决编码问题

为了解决每次get或者post方式提交数据的时候,编码解码方式不同导致乱码的问题,直接在过滤器中自动过滤

新建过滤器Filter

public class GlobalDecodeFilter implements Filter
{
    @Override
    public void destroy()
    {

    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse response,
            FilterChain filterChain) throws IOException, ServletException
    {
        HttpServletRequest request = (HttpServletRequest) req;
        //**告诉浏览器编码方式**
        response.setContentType("text/html;charset=utf-8");

        //过滤post方式提交的数据  POST一定要大写
        if (request.getMethod().equals("POST"))
        {
            request.setCharacterEncoding("utf-8");//请求数据的编码
            filterChain.doFilter(request, response);
        }else 
        {
            //过滤get方式提交的数据,先用iso-8859-1解码(包装一下)
            HttpServletRequest request2 = new MyRequest((HttpServletRequest) request);
            filterChain.doFilter(request2, response);
        }   
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException
    {

    }

}

新建包装类,处理get方式的request

//包装类 重写3个API,过滤参数的value值
class MyRequest extends HttpServletRequestWrapper
{
    @Override
    public String getParameter(String name)
    {
        String param = super.getParameter(name);
        String key = null;
        try
        {
            if (param !=null)
            {
                 byte[] bytes = param.getBytes("iso-8859-1");
                 key = new String(bytes, "utf-8");
            }

        }
        catch (UnsupportedEncodingException e)
        {
            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();
                }
            }
        }

        System.out.println("map解码");

        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;
    }

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

web.xml中定义一个过滤器,注意filter定义一定要按提示顺序来,写在servlet前,否则报错

<filter-mapping>
    <filter-name>LoginServlet</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>  
<filter-mapping>
    <filter-name>globladecoder</filter-name>
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>  
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值