一、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;

          }

        }

Filter(过滤器)的更多相关文章

  1. filter 过滤器(监听)

    Filter 过滤器 1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, ...

  2. Java防止SQL注入2(通过filter过滤器功能进行拦截)

    首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦 ...

  3. Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  4. javaweb学习总结(四十二)——Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  5. Filter过滤器简单应用( 接口访问控制 )

    一.描述 在提供安卓.IOS客户端接口时,可以在登陆接口分配Session给客户端,用于判断其他接口是否是合法访问,以避免将所有的接口都暴露在web中可以由路径直接访问.但是最近的一个项目中的移动接口 ...

  6. 如何配置Filter过滤器处理JSP中文乱码

    参考Tomcat服务器目录webapps的examples示例 简单配置步骤:1.在项目web.xml文件添加过滤器标记<filter>和<filter-mapping>:2. ...

  7. Filter(过滤器)常见应用

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...

  8. Filter过滤器(1)

    Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

  9. Servlet的学习之Filter过滤器技术(1)

    本篇将讲诉Servlet中一项非常重要的技术,Filter过滤器技术.通过过滤器,可以对来自客户端的请求进行拦截,进行预处理或者对最终响应给客户端的数据进行处理后再输出. 要想使用Filter过滤器, ...

  10. javaWeb学习总结(10)- Filter(过滤器)学习

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...

随机推荐

  1. sonar安装

    ##jdk不要用yum下载的 一.下载sonar源码 cd /usr/local/src wget https://sonarsource.bintray.com/Distribution/sonar ...

  2. ServiceLoader详解

    系统中用到了ServiceLoader,查了一下: ServiceLoader与ClassLoader是Java中2个即相互区别又相互联系的加载器.JVM利用ClassLoader将类载入内存,这是一 ...

  3. Yii2上传图片插件使用

    例子: 1.在表单中: <?php $form = \yii\widgets\ActiveForm::begin([ 'options'=>[ 'class' => 'form-ho ...

  4. centos6 nginx 安装【转】

    原文 https://www.cnblogs.com/yaoximing/p/6068622.html 1.下载nginx 方法一 wget http://nginx.org/download/ngi ...

  5. MySQL各版本解释和下载

    MySQL 的官网下载地址:http://www.mysql.com/downloads/ 个人理解: 1.不要再纠结是否是5.1还是5.5.5.6.5.7这些,一般选择时不要选择太新,选择5.1或者 ...

  6. python字典与集合操作

    字典操作 字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划.字母来查对应页的详细内容. 语法: info = { 's1': "jack", 's3' ...

  7. jquery 循环绑定click的问题

    之前循环数据,通过live绑定click, 发觉每个click绑定的链接参数都是一样的. 后来改用 直接的 click绑定,就好了. $.each(ship.PPRList, function (i, ...

  8. D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询

    题意 贴海报 最后可以看到多少海报 思路 :离散化大区间  其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时  把y+1点也加入 ...

  9. BZOJ3277 串 【后缀数组】【二分答案】【主席树】

    题目分析: 用"$"连接后缀数组,然后做一个主席树求区间内不同的数的个数.二分一个前缀长度再在主席树上求不同的数的个数. 代码: #include<bits/stdc++.h ...

  10. 【XSY2741】网格 分治 LCT 并查集

    题目描述 有一个\(n\times m\)的网格,线框的交点可以扭动,边不可伸缩.网格中有一些格子里面放了'x'形的支架,这些格子不会变形,但可以整体转动.如果所有格子都不能变形,那么称这个网格稳固. ...