首页 > 技术文章 > 全局的编码过滤器

YuTaiYin 2017-07-17 18:27 原文

全局的编码过滤器

分析:

我们之前做的操作,只能对post请求是ok

   

怎样可以做成一个通用的,可以处理post,get所有的请求的?

   

java中怎样可以对一个方法进行功能增强?

  • 继承
  • 装饰设计模式
    • 创建一个类让它与被装饰类实现同一个接口或继承同一个父类
    • 在装饰类中持有一个被装饰类的引用
    • 重写要增强的方法

       

    问题:我们获取请求参数有以下方法

  • getParameter
  • getPrameterValues
  • getParameterMap

    这三个方法都可以获取请求参数。

       

    分析后,我们知道getParametergetParameterValue方法可以依赖于getParamterMap方法来实现。

       

    // 这个就是我们对request进行装饰的类

    class MyRequest extends HttpServletRequestWrapper {

       

    private HttpServletRequest request;// 是用于接收外部传递的原始的request

       

    public MyRequest(HttpServletRequest request) {

    super(request); // 是因为父类没有无参数构造

    this.request = request;

    }

    // @Override

    // public String getParameter(String name) {

    // // 1.得到原来的getParameter方法的值

    // String value = request.getParameter(name); // 乱码

    //

    // try {

    // return new String(value.getBytes("iso8859-1"), "utf-8");

    // } catch (UnsupportedEncodingException e) {

    // e.printStackTrace();

    // }

    // return null;

    // }

       

       

    @Override

    public String getParameter(String name) {

       

    if (name != null) {

    String[] st = (String[]) getParameterMap().get(name);

    if (st != null && st.length > 0) {

    return st[0];

    }

    }

    return null;

    }

       

    @Override

    public String[] getParameterValues(String name) {

    if (name != null) {

       

    return (String[]) getParameterMap().get(name);

    }

    return null;

    }

       

    private boolean flag = true;

       

    @Override

    public Map getParameterMap() {

    // 1.得到原始的map集合

    Map<String, String[]> map = request.getParameterMap();// 乱码

       

    if (flag) {

    // 2.map集合中的String[]得到,解决每一个元素的乱码问题.

    for (String key : map.keySet()) {

       

    String[] st = map.get(key); // 得到每一个数组

       

    for (int i = 0; i < st.length; i++) {

       

    try {

    st[i] = new String(st[i].getBytes("iso8859-1"), "utf-8");

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    }

    }

       

    }

    flag = false;

    }

    return map;

       

    }

       

       

    }

推荐阅读