• 全局编码过滤


    分析过程:

    解决:

    1、使用装饰模式   增强request的功能

         装饰:1、装饰类和被装饰类要实现同一接口或者继承同意对象

                  2、被装饰类对象的引用传递给装饰类的构造方法

                  3、重写方法,进行功能增强

          如果已经有装饰的类或者接口,直接实现或继承即可

          代码实现:

                  1、class Myrequest extends HttpServletRequestWrapper{

                            private HttpServletRequest request;

                            public Myrequest(){

                                      super(request);

                      this.request=request;                     

                                       }

                            }

                      注意:HttpServletRequestWrapper没有无参构造方法,子类需要指定构造方法。

                    2、要重写关于请求参数获取的方法。

                         String getParameter(String name);

                         String[] getParameterValues(String name);

                         Map<String,String[]> getPatameterMap();

                         通过分析,发现getParameter(String name)、getParameter(String name)方法可以依赖于getPatameterMap()方法实现,也就是说,我们重点需要重写getPatameterMap()方法就可以了,其他两个调用getPatameterMap();

                          代码如下:

                                 

    public class MyRequest extends HttpServletRequestWrapper {
    private HttpServletRequest request;
    public MyRequest(HttpServletRequest request) {
    super(request);
    this.request=request;
    }

    @Override
    public String getParameter(String name) {
    Map<String,String[]> map=getParameterMap();
    if(name==null){
    return null;
    }
    String[] values=map.get(name);
    if(values==null|| values.length==0){
    return null;
    }
    return values[0];
    }

    @Override
    public String getParameterNames(String name) {
    Map<String,String[]> map=getParameterMap();
    if(name==null){
    return null;
    }
    String[] values=map.get(name);
    return values;
    }
    private boolean flag=true;
    @Override
    public Map getParameteString {
    //获取所有的map集合
    Map<String,String[]> map=request.getParameterMap();
    //遍历map集合 解决编码问题
    if(flag){for(String key:map.keySet()){
    String[] values=map.get(key);
    //将获取的值的编码改变成utf-8
    for(int i=0;i<values.length;i++){
    try{values[i]=new String(values[i].getBytes("iso8859-1"),"utf-8");
    }catch(UnsupportedEncodingException e){
    e.printStackTrace();
    }
    }
    }
    flag=false;
    }
    return map;
    }

       

    2、Filter中写的内容:

    package cn.ahnu.a;

    import java.io.IOException;

    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.HttpServletResponse;

    public class FilterDemo implements Filter {

    public void destroy() {

    }

    public void doFilter(ServletRequest arg0, ServletResponse arg1,
    FilterChain arg2) throws IOException, ServletException {

    HttpServletRequest reqeust=(HttpServletRequest) arg0;
    HttpServletResponse response = (HttpServletResponse) arg1;
    //使用自己寫的裝飾類增強request的功能
    MyRequest request=new MyRequest(request);
    //這裡所使用的就是裝飾的request對象
    arg2.doFilter(reqeust, response);

    }

    public void init(FilterConfig arg0) throws ServletException {

    }

    }

    3、配置的web.xml

    <filter>
    <filter-name>FilterDemo</filter-name>
    <filter-class>cn.ahnu.a.FilterDemo</filter-class>
    </filter>

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

    再运行即可解决get、post的中文乱码问题

  • 相关阅读:
    VC++以及VS个版本比较 及 C++编译器比较
    这本书的封面
    json_encode(),json_deocde()用法说明
    循环匹配,一般用于多选列表选中状态
    js判断变量是否被定义
    js onload()事件调用方法
    js push使用方法
    iframe去掉边滚动条
    ajax上传文件(使用ajaxfileupload)
    基于url的权限控制
  • 原文地址:https://www.cnblogs.com/leiandjing/p/5780516.html
Copyright © 2020-2023  润新知