一、Filter概述

Filter称为过滤器,它是Servlet技术中最实用的技术,web开发人员通过Filter技术,对web服务器所管理的资源(JSP,Servlet,静态图片或静态html文件)进行拦截,从而实现一些特殊的功能。

Filter就是过滤从客户端向服务器发送的请求。

二、过滤器原理

三、Filter入门

3.1 第一步:编写一个类实现Filter接口

3.2 第二步:对过滤器进行配置

3.3 第三步:编写JSP页面

访问JSP页面,发现不加放行语句时,前端页面不显示。加上后显示正常。

四、FilterChain对象

4.1 概述

FilterChain过滤器链:在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为是一个过滤器链。

Web服务器根据Filter在web.xml文件中的注册顺序(mapping的配置顺序)决定先调用那个Filter。依次调用后面的过滤器,如果没有下一个过滤器,调用目标资源

4.2 FilterChain的演示

执行结果:(发出请求时xml配置顺序,响应时候按照xml逆序)

4.3 Filter的生命周期

Filter的创建和销毁是由web服务器负责。Web应用程序启动的时候,web服务器创建Filter的实例对象。并调用其init方法进行初始化(filter对象只会创建一次,init方法也只会执行一次)。

每次filter进行拦截的时候,都会执行doFilter的方法。

当服务器关闭的时候,应用从服务器中移除的时候,服务器会销毁Filter对象

4.4 FilterConfig对象的概述

4.4.1 FilterConfig对象的作用

用来获得Filter的相关的配置的对象

4.4.2 FilterConfig对象的API

4.4.4 FilterConfig的演示

4.5 过滤器的相关配置

<url-pattern>的配置

  1. 完全路径匹配           :以/开始   比如/aaa  /aaa/bbb
  2. 目录匹配                    :以/开始 以*结束  比如/*  /aaa/*  /aaa/bbb/*
  3. 扩展名匹配               :不能以/开始 以*开始 比如*.jsp  *.do   *.action

<servlet-name>的配置

专门以Servlet的配置的名称拦截Servlet。

<dispatcher>的配置

  1. 默认的情况下过滤器会拦截请求。如果进行转发(需要拦截这次转发)。
  2. dispatcher的取值
    1. REQUEST :默认值。默认过滤器拦截的就是请求。
    2. FORWARD:转发。
    3. INCLUDE  :页面包含的时候进行拦截
    4. ERROR      :页面出现全局错误页面跳转的时候进行拦截

4.6 代码案例:权限验证过滤器

现在一个网站上需要有登录的功能,在登录成功后,重定向到后台的成功页面(后台的页面有很多)。如果现在没有登录直接在地址栏上输入后台页面地址。

编写一个过滤器:可以对没有登录的用户进行拦截。(没有登录,回到登录页面。如果已经登录,放行。

4.6.1 创建表

create database web05;
use web05;
create table user(id int primary key auto_increment,username varchar(20),password varchar(20)
);
insert into user values (null,'aaa','123');

4.6.2 创建项目并引入jar包

4.6.3 引入数据库配置文件

4.6.4  创建 util包并导入工具类

4.6.4 新建三层架构:domain/model/controller

4.6.5 实体类的创建

4.6.6 新建模型层和控制层

4.6.7 数据库连接配置

4.6.8 登录页面

注意:小技巧

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录页面</h1>
<h3><font>${msg}</font></h3>
<!-- 错误信息 -->
<form action="${ pageContext.request.contextPath}/UserServlet" method="post"><table border="1" width="400"><tr><td>用户名</td><td><input type="text" name="username"></td></tr><tr><td>密码</td><td><input type="password" name="password"></td></tr><tr><td colspan="2"><input type="submit" value="登录"></td></tr></table>
</form></body>
</html>

4.6.9 登录成功的页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录成功,欢迎${existUser.username}</h1>
</body>
</html>

4.6.10 访问

http://localhost/demo6/UserServlet

4.7 权限过滤器二

4.7.1 新建filter包和类

4.7.2 filter代码

package com.itheima.filter;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 com.itheima.domain.User;
import com.sun.deploy.nativesandbox.comm.Request;
import com.sun.net.httpserver.Filter.Chain;public class filter implements Filter {@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stub
//      判断用户是否登录,登录就放行,没登录跳转到登录页面HttpServletRequest req = (HttpServletRequest) arg0;User existUser = (User) req.getSession().getAttribute("existUser");if(existUser == null) {req.setAttribute("msg", "未登录,无权限访问!");req.getRequestDispatcher("/login.jsp").forward(arg0, arg1);}else {arg2.doFilter(req, arg1);}}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}

4.7.3 xml配置

4.8 案例:通用的字符集编码过滤器的分析

4.8.1 案例需求

网站,需要向后台提交中文的数据(有可能是GET也有可能是POST)。中文处理根据不同的请求方式,处理的方式也是不一样的。

需要调用request.getParameter();方法接收数据,但是这个时候无论是get还是post接收的数据都是存在乱码。现在调用request.getParameter()方法无论是get还是post请求提交的中文,都没有乱码。

4.8.2 增强一个类的方法

通过上面的分析,现在增强request的getParameter的方法。增强的过程要写在过滤器中。

  1. 如何增强一个类中的方法?

    1. 继承

      1. 必须要能够控制这个类的构造。
    2. 装饰者
      1. 被增强的类和增强的类需要实现相同的接口。
      2. 在增强的类中获得被增强的类的引用。
      3. 缺点:接口中的方法过多,重写很多其他的方法。
    3. 动态代理

                       1.类需要实现接口

过滤器的代码

  1. 增强类的代码

Eclipse15:Filter相关推荐

  1. Python 常用内置函数map、zip、filter、reduce、enumerate

    Python 中有许多非常实用的内置函数,通过这些函数我们可以方便的实现某些功能,下面就列举一些常用的内置函数. 1. map() 函数 map() 可以根据提供的函数对指定序列做映射,它接受一个函数 ...

  2. 2021年大数据常用语言Scala(二十四):函数式编程 过滤  filter

    目录 过滤  filter 定义 方法签名 方法解析 案例 参考代码 过滤  filter 过滤符合一定条件的元素 定义 方法签名 def filter(p: (A) ⇒ Boolean): Trav ...

  3. [JAVA EE] Filter过滤器

    Filter过滤器 ◼ 过滤器(Filter)可以动态地拦截请求和响应. ◼ 应用场景:过滤敏感词汇.防止SQL注入.设置字符编码.进行URL级 别的权限访问控制.压缩响应信息等. 启动文件DemoA ...

  4. Python 高阶函数filter、map、reduce、reversed、sorted及迭代器函数 iter

    1. filter(function, iterable) 过滤器,过滤掉不满足函数 function 的元素,重新返回一个新的迭代器. 其中 function 函数的第一个参数是可迭代对象 iter ...

  5. java 过滤器Filter

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

  6. Jetty Cross Origin Filter解决jQuery Ajax跨域访问的方法

    当使用jQuery Ajax post请求时可能会遇到类似这样的错误提示 XMLHttpRequest cannot load http://xxxxxx. Origin http://xxxxxx ...

  7. 机器人控制算法——Bayes Filter贝叶斯滤波器

    机器人控制算法--Bayes Filter贝叶斯滤波器 概率方法 Probabilistic Approaches. Recursive Bayes Filter. Prediction and Co ...

  8. python filter过滤器的使用_如何在Python 3中使用过滤器、映射和精简

    的功能map和filter被有意更改为返回迭代器,并从内置并放置在functools.reduce. 所以,为了filter和map,你可以用list()像你以前一样看到结果. >>> ...

  9. java servlet filter_Java的Servlet、Filter、Interceptor、Listener

    写在前面: 使用Spring-Boot时,嵌入式Servlet容器可以通过扫描注解(@ServletComponentScan)的方式注册Servlet.Filter和Servlet规范的所有监听器( ...

最新文章

  1. LeetCode简单题之自除数
  2. Udacity机器人软件工程师课程笔记(六)-样本搜索和找回-基于漫游者号模拟器-优化和样本找回
  3. 你知道dos和cmd之间的关系以及区别吗?
  4. 动态规划(一)简单例子
  5. Python——有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
  6. HD1864_最大报销额
  7. git - 搭建最简单的git server
  8. python_Day5_web开发(下)
  9. JavaScript实现bellmanFord贝尔曼-福特算法(附完整源码)
  10. python列表按照批次分配数据(亲测)
  11. linux indent格式化代码
  12. 面试题:如何实现一个深拷贝
  13. android 常用命令,Android开发常用命令整理
  14. MATLAB一维数组的创建与元素提取
  15. this指向 - 总结
  16. json转为tfrecord格式文件怎么转_word怎么转换成pdf格式?这样转很方便
  17. 云计算学习笔记003---Hadoop简介,hadoop实现原理,NoSQL介绍...与传统关系型数据库对应关系,云计算面临的挑战
  18. PL/SQL编程1-基础
  19. RedHat 安装 CentOS yum
  20. 基于javaweb的员工绩效考核系统

热门文章

  1. MATLAB下配置C和C++编译器(MinGW)
  2. [再寄小读者之数学篇](2014-07-16 二阶中值)
  3. 一键生成轮播图,轮播图插件
  4. 小花梨的取石子游戏 ( 博弈 )
  5. USB连不上电脑,出现Unknown Device问题
  6. 边缘设备、系统及计算杂谈(2)——go语言
  7. Android电子书翻页效果
  8. 学java需要装jdk吗_JAVA基础之JDK安装
  9. Android仿京东、淘宝商品详情页上拉查看更多详情
  10. 行业研究分析-全球与中国Type-C数据线市场现状及未来发展趋势