首页 > Filter(过滤器)

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链

        由来确定



    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类的包名.类名

        


        

          filter名称

          路径

        


      关于其它配置:

        1.

          完全匹配   以”/demo1”开始,不包含通配符*

          目录匹配   以”/”开始 以*结束

          扩展名匹配   *.xxx 不能写成/*.xxx

        2.

          它是对指定的servlet名称的servlet进行拦截的。

        3.

          可以取的值有 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 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;

          }

        }

转载于:https://www.cnblogs.com/soficircle/p/6935078.html

更多相关:

  • importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;//结果与DES算...

  • 题目:替换空格 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 输入:s = "We are happy." 输出:"We%20are%20happy." 限制: 0 <= s 的长度 <= 10000 解题: 时间复杂度:O(n) 空间复杂度:O(n) class Solution { public:s...

  • 在C++11标准库中,string.h已经添加了to_string方法,方便从其他类型(如整形)快速转换成字面值。 例如: for (size_t i = 0; i < texArrSize; i++)RTX_Shader.SetInt(string("TexArr[") + to_string(i) + "]", 7 + i);...

  • Ubuntu 14.04安装并升级之后,变成楷体字体非常难看,我昨天搞了一晚上,终于理了个头绪,这里整理一下。 经过网上调研,大家的一致看法是,使用开源字体库文泉驿的微黑字体效果比较理想,甚至效果不输windows平台的雅黑字体。下面我打算微黑来美化Ubuntu 14.04. 1.安装文泉驿微黑字体库 sudo aptitude...

  • 使用string时发现了一些坑。 我们知道stl 容器并不是线程安全的,所以在使用它们的过程中往往需要一些同步机制来保证并发场景下的同步更新。 应该踩的坑还是一个不拉的踩了进去,所以还是记录一下吧。 string作为一个容器,随着我们的append 或者 针对string的+ 操作都会让string内部的数据域动态增加,而动态增加的...

  • 过滤器(filter)正如其名,作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果。主要用在数据的格式化上,例如获取一个数组中的子集,对数组中的元素进行排序等。ng内置了一些过滤器,它们是:currency(货币)、date(日期)、filter(子串匹配)、json(格式化json对象)、limitTo(限制个数)、l...

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...