当前位置: 首页 > 编程日记 > 正文

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;

}

}

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

相关文章:

css3实现3D立体翻转效果

1、在IE下无法显示翻转效果&#xff0c;火狐和谷歌可以 1 /*样式css*/2 3 .nav-menu li {4 display: inline;5 }6 .nav-menu li a {7 color: #fff;8 display: block;9 text-decoration: none;10 overflow: visible;11 line-height: 40px;12 font-…

Ant Design 入门-参照官方文档使用组件

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 先来一个按钮组件使用的对比,官方文档的(不能直接用)和实际能用的。 官网demo: import { Table, Divider, Tag } from antd;const columns = [{title: Name,dataIndex: name,key: name,render: text =…

如何用JavaScript的回调函数做出承诺

by Adham El Banhawy由Adham El Banhawy 如何用JavaScript的回调函数做出承诺 (How to make a Promise out of a Callback function in JavaScript) Back-end developers run into challenges all the time while building applications or testing code. As a developer who …

VMware里的linux系统里的命令行里会有bee的声音,要如何关掉

VMware里的linux系统里的命令行里会有bee的声音&#xff0c;要如何关掉 取消bell报警声的方法&#xff1a;登陆linux系统vi /etc/inputrc找到set bell-style none 将前面的&#xff03;去掉&#xff0c;之后重启系统即可解决声音问题若不见效可以通过下面的方式解决下bell-styl…

React-Todos

最近学完React的最基本概念&#xff0c;闲下来的时候就自己写了一个Todo-List的小应用。这里做个简略的说明&#xff0c;给想好好学React的新手看。 React-Todo 学习前提 这里我用了webpackb做了babel和JSX预处理和模块打包。所以对React和一些ES2015&#xff08;ES6&#xff0…

Ant Design 入门-引用自己命名的组件

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 自己创建的组件:代码 import { Table, Divider, Tag } from antd; import React, { Component } from react; export default class My_Table extends Component {render() {const columns = [{title: …

迷宫出路代码_如何在软件开发的迷宫中找到自己的出路

迷宫出路代码by Tim Kleier蒂姆克莱尔(Tim Kleier) 如何在软件开发的迷宫中找到自己的出路 (How to find your way through the corn maze of software development) The corn maze is one of my favorite challenges to tackle. It’s an unnerving experience, especially w…

打包 React 项目并在服务器运行。

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 1.找到项目根目录的package.json文件&#xff1a;如图&#xff1a; 2.打开cmd执行&#xff1a;npm run build 3.生成DIST文件夹。 4.把DIST文件放到服务器phpStudty根目录&#xff0c;访问index.html。…

一些有用的Python问题

1. 修改IDLE工作路径&#xff0c;在命令交互模式下输入如下指令&#xff1a; >>> import os >>> os.getcwd() #查看当前的工作路径 >>> os.chdir(E:\\Python\\Demo) #修改当前的工作路径 2.Python中 ImportError: cannot import name NUMPY_MKL 的…

Python核心编程笔记---- print

在仅用变量名时&#xff0c;输出的字符串是用单引号括起来的。这个是为了让非字符串对象也可能以字符的形式显示在屏幕上。 而print 函数打印出来的是变量的值。 print 调用的是str()方法。而仅用变量名时调用的是repr()方法。 证明&#xff1a;------------------------------…

latex 插图解释_大O符号-只需插图和视频即可解释

latex 插图解释Big O notation is used to communicate how fast an algorithm is. This can be important when evaluating other people’s algorithms, and when evaluating your own! In this article, I’ll explain what Big O notation is and give you a list of the m…

[YTU]_2002(C语言实验——单词统计)

Description 从键盘输入一行字符&#xff0c;统计其中单词的个数&#xff0c;各单词以空格分隔&#xff0c;且空格数可以是多个。Input 输入只有一行句子。仅有空格和英文字母构成。 Output 单词的个数。 Sample Input stable marriage problem Consists of Matching memb…

资本中国人物-金融

一、二、三、店、五、土地、七、八、玖、拾起、白、千、一万、一亿、元(圆)、角、支、零、整个。这是上图中我们经常要填写。问&#xff1a;什么是它用数词&#xff1f;想必很多人都不是很清楚&#xff01; 请看下面的两个相关的表数词&#xff1a; 1、数字化和大、小写数字对照…

Ant Design Pro 网络请求流程

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 在 Ant Design Pro 中&#xff0c;一个完整的前端 UI 交互到服务端处理流程是这样的&#xff1a; UI 组件交互操作&#xff1b; 调用 model 的 effect&#xff1b; 调用统一管理的 service 请求函数&a…

在Google Cloud Platform上持续部署Node.js

by Gautam Arora由Gautam Arora 在Google Cloud Platform上持续部署Node.js (Continuous Deployment for Node.js on the Google Cloud Platform) Google Cloud Platform (GCP) provides a host of options for Node developers to easily deploy our apps. Want a managed ho…

hdu-1108 最小公倍数

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid1108 题目类型&#xff1a; 数论 题意概括&#xff1a; 求两个数的最小公倍数 解题思路&#xff1a; 模拟 题目&#xff1a; 最小公倍数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O…

sql-schema与catalog

schema&#xff1a; 指的是说当偶create database caiceclb时&#xff0c;caiceclb就是一个schema catalog&#xff1a; 指的是所有的database目录&#xff0c;就像上图显示的那样&#xff0c;将MySQL原来的&#xff08;mysql,infomation_schema&#xff09;及后来新建的的data…

这是如何更好地利用JavaScript数组的方法

by pacdiv由pacdiv 这是如何更好地利用JavaScript数组的方法 (Here’s how you can make better use of JavaScript arrays) Quick read, I promise. Over the last few months, I noticed that the exact same four mistakes kept coming back through the pull requests I c…

07、C语言——函数

函数 1、函数定义 函数返回值类型 函数名&#xff08;形式参数列表&#xff09;      {         函数体&#xff1b;      } 注意&#xff1a; 定义有参函数时&#xff0c;形参的定义可以采用传统方式或现代方式两种 1&#xff09;传统方式&#xff1a; int …

This is probably not a problem with npm. There is likely additional logging output above

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 E:\weii_objct\invoice-manage-web-view>npm start > ant-design-pro@2.1.0 start E:\weii_objct\invoice-manage-web-view > cross-env APP_TYPE=site umi dev cross-env 不是内部或外部命令…

parcel react_如何使用Parcel捆绑React.js应用程序

parcel reactby Michael Ozoemena迈克尔奥索埃梅纳(Michael Ozoemena) 如何使用Parcel捆绑React.js应用程序 (How to use Parcel to bundle your React.js application) 什么是包裹&#xff1f; (What’s Parcel?) Parcel is a web application bundler which offers a blazi…

SparkSQL 与 Spark Core的关系

不多说&#xff0c;直接上干货&#xff01; SparkSQL 与 Spark Core的关系 Spark SQL构建在Spark Core之上&#xff0c;专门用来处理结构化数据(不仅仅是SQL)。 Spark SQL在Spark Core的基础上针对结构化数据处理进行很多优化和改进&#xff0c; 简单来讲&#xff1a; Spark SQ…

linux操作系统-设置静态ip

在使用linux虚拟机的时候因为经常有关机的需求,然后重新开机后可能面临这上一次获取的ip被改变,在这里我分享一下在linux 下设置静态ip的经验 1.查看路由状态 [rootlocalhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Met…

判断数组里面的下标是否等于一个字符串

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 使用includes() 1、判断字符串里面是否包含一个字符串 示例&#xff1a; var a aaaaaaaavconsole.log(a.includes(v)); //truevar a aaaaaaaavconsole.log(a.includes(c)); //falsevar a aa…

如何获得更多的自由开发者客户

by Jad Joubran通过贾德乔布兰(Jad Joubran) 如何获得更多的自由开发者客户 (How to get more clients as a freelance developer) 我希望几年前知道的实用技巧 (Practical tips I wish I knew a few years ago) Whenever a conversation about freelancing kicks off with fe…

2017.6.4 入门组 NO.2——睡眠

其实这题就是将第二个时间-第一个时间&#xff0c;小于0的补全就A了代码如下&#xff1a; var x,y,k:string;l1,l2,x1,x2,x3,y1,y2,y3:longint; beginreadln(x);readln(y);l1:pos(:,x);l2:pos(:,y);k:copy(x,1,2); val(k,x1);k:copy(x,l11,2); val(k,y1);k:copy(y,1,2); val(k…

微信小程序获取用户收货地址 完整代码

微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 获取用户收货地址需要用户点击授权&#xff0c;所以有两种情况&#xff0c;确认授权、取消授权。 情况一&#xff0c;用户第一次访问用户地址授权&#xff0c;并且点击确定授权。 情况二&#xff0c;用…

easyui的combobox下拉框初始化默认值以及保持该值一直显示的方法

easyui的combobox下拉框默认初始值是空&#xff0c;下面是实现从远程加载数据之后初始化默认值,以及让该值一直排在下拉框的最顶部的方式。 目前的需求是需要在初始化的时候添加"全部数据库"字段,并且在下拉的时候,"全部数据库"一直排在最顶部。 初始化效果…

关系数据库非关系数据库_如何与关系数据库最佳配合

关系数据库非关系数据库Relational databases handle data smoothly, whether working with small volumes or processing millions of rows. We will be looking at how we can use relational databases according to our needs, and get the most out of them.关系数据库无论…

看过的bootstrap书籍(附下载地址)

http://yun.baidu.com/share/link?shareid3820784617&uk1008683945 以下书籍下载地址。 《BootStrap入门教程》 就是网上的常规教程&#xff0c;过了一遍&#xff0c;不是很重要。 《Bootstrap实战_第一章》 没找到其余的章节&#xff0c;不过这本书不如直接看网上的boots…