• Filter(过滤器)


    一、Filter过滤器(重要)
        Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。

      1、Filter快速入门
        1.1、步骤:
          1. 创建一个类实现Filter接口
          2. 重写接口中方法 doFilter方法是真正过滤的。
          3. 在web.xml文件中配置

          注意:在Filter的doFilter方法内如果没有执行chain.doFilter(request,response)
            那么资源是不会被访问到的。

        1.2、FilterChain
          FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。

          过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。

            只要多个Filter对同一个资源进行拦截就可以形成Filter链
            由<filter-mapping>来确定


        1.3、Filter生命周期
          类似于Servlet生命周期:
            实例化 --》 初始化 --》 服务 --》 销毁

           当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
           当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
           当服务器关闭时,会调用Filter的destroy方法来进行销毁操作.


        1.4、FilterConfig
          在Filter的init方法上有一个参数,类型就是FilterConfig.
          FilterConfig它是Filter的配置对象,它可以完成下列功能
            1. 获取Filter名称
            2. 获取Filter初始化参数
            3. 获取ServletContext对象。

        1.5、Filter配置
          基本配置:
            <filter>
              <filter-name>filter名称</filter-name>
              <filter-class>Filter类的包名.类名</filter-class>
            </filter>
            <filter-mapping>
              <filter-name>filter名称</filter-name>
              <url-pattern>路径</url-pattern>
            </filter-mapping>
          关于其它配置:
            1.<url-pattern>
              完全匹配   以”/demo1”开始,不包含通配符*
              目录匹配   以”/”开始 以*结束
              扩展名匹配   *.xxx 不能写成/*.xxx
            2.<servlet-name>
              它是对指定的servlet名称的servlet进行拦截的。
            3.<dispatcher>
              可以取的值有 REQUEST FORWARD ERROR INCLUDE
              它的作用是:当以什么方式去访问web资源时,进行拦截操作.


                1.REQUEST 当是从浏览器直接访问资源,或是重定向到某个资源时进行拦截方式配置的 它也是默认值
                2.FORWARD 它描述的是请求转发的拦截方式配置
                3.ERROR 如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。
                4.INCLUDE 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用

    二、MD5加密
        在mysql中可以对数据进行md5加密
          Md5(字段)
            UPDATE USER SET PASSWORD=MD5(PASSWORD);

          在java中也提供了md5加密
            /**
            * 使用md5的算法进行加密
            */
            public static String md5(String plainText) {
              byte[] secretBytes = null;
              try {
                secretBytes = MessageDigest.getInstance("md5").digest(
                plainText.getBytes());
              } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException("没有md5这个算法!");
              }
              String md5code = new BigInteger(1, secretBytes).toString(16);
              for (int i = 0; i < 32 - md5code.length(); i++) {
                md5code = "0" + md5code;
              }
              return md5code;

    三、全局的编码过滤器

      在java中怎样可以对一个方法进行功能增强?
        1. 继承
        2. 装饰设计模式
          1. 创建一个类让它与被装饰类实现同一个接口或继承同一个父类
          2. 在装饰类中持有一个被装饰类的引用
          3. 重写要增强的方法

      我们获取请求参数有以下方法
        1. getParameter
        2. getPrameterValues
        3. getParameterMap
        这三个方法都可以获取请求参数。

        分析后,我们知道getParameter与getParameterValue方法可以依赖于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;

              }

            }

  • 相关阅读:
    LeetCode 449. Serialize and Deserialize BST
    LeetCode Word Abbreviation
    LeetCode 402. Remove K Digits
    LeetCode 439. Ternary Expression Parser
    LeetCode Frog Jump
    LeetCode 630. Course Schedule III
    LeetCode 729. My Calendar I
    LeetCode 567. Permutation in String
    LeetCode Find Permutation
    LeetCode Number of Atoms
  • 原文地址:https://www.cnblogs.com/soficircle/p/6935078.html
Copyright © 2020-2023  润新知