Filter过滤器简介

  ServletAPI中提供了一个Filter接口,开发web应用时,如果编写的 java 类实现了这个接口,则把这个java类称之为过滤器Filter。

  WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

  通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理

Filter的生命周期

  和Servlet一样,Filter的生命周期也是由Web服务器来负责的。

  实例化-->初始化-->服务-->销毁

  和Servlet生命周期的区别:

  1. 启动服务器时加载实例,Filter直接初始化,Servlet是第一次访问时初始化。
  2. Servlet从第一次到以后的多次访问,都是只调用doGet()或doPost()方法; Filter只调用方法doFilter()进行处理

实现Filter接口以后,会有三个方法:

  • public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)     //执行过滤操作
  • public void init(FilterConfig fConfig)                                                                                     //通过FilterConfig 获取Config 配置对象者其它域对象
  • public void destroy()                                                                                                      //销毁时执行

简单用法:

首先新建类 MyFilter 实现  Filter接口

//首先实现  Filter
public class MyFilter implements Filter { public MyFilters() {
// TODO Auto-generated constructor stub
} /**
* 销毁时执行
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* 在Serveice方法钱执行过滤操作
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response);
} /**
* 获取配置信息
*/
public void init(FilterConfig fConfig) throws ServletException { }

然后在Web.xml配置文件中添加配置信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>com.wwj.Filter</display-name> <filter>
<filter-name>MyFilter</filter-name>
<!-- 类的限定名 -->
<filter-class>com.wwj.Filte.MyFilter</filter-class>
<init-param>
<param-name>ip</param-name>
<param-value>127.0.0.1</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 名称和上面的名称保持一致 -->
<filter-name>MyFilter</filter-name>
<!-- 过滤的URL地址,此种写法是过滤所有 -->
<url-pattern>/*</url-pattern>
<!-- 设置需要过滤的请求,默认是Request -->
<dispatcher>REQUEST</dispatcher>
</filter-mapping> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

这样一个简单的过滤器就配置好了!

下面演示一个过滤IP的小Demo:

首先在Web.xml配置需要过滤的IP地址

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>com.wwj.Filter</display-name> <filter>
<filter-name>MyFilter</filter-name>
<!-- 类的限定名 -->
<filter-class>com.wwj.Filte.MyFilter</filter-class>
<init-param>
<!-- 参数名,相当于Key -->
<param-name>ip</param-name>
<!-- 参数值,相当于Value -->
<param-value>127.0.0.1</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- 名称和上面的名称保持一致 -->
<filter-name>MyFilter</filter-name>
<!-- 过滤的URL地址,此种写法是过滤所有 -->
<url-pattern>/*</url-pattern>
<!-- 设置需要过滤的请求,默认是Request -->
<dispatcher>REQUEST</dispatcher>
</filter-mapping> <welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

然后在程序里读取配置的需要过滤的IP地址,然后在doFilter进行过滤:

(服务器和客户端为一台机器时,地址不能写http:localhost:8008/xxx ,应该写  http:127.0.0.1:8008/xxx 这种方式)

//首先实现  Filter
public class MyFilters implements Filter { //定义变量
private FilterConfig config; public MyFilters() {
// TODO Auto-generated constructor stub
} /**
* 销毁时执行
*/
public void destroy() {
// TODO Auto-generated method stub
} /**
* 在Serveice方法钱执行过滤操作
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//读取we.xml配置的IP地址
String FilterIp = this.config.getInitParameter("ip");
//获取当前客户端的地址
String ip = request.getRemoteAddr();
System.out.println(ip);
if (ip.equals(FilterIp)) {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("<b>该IP被设置禁止访问!!!</b>");
} else {
System.out.println("IP不在过滤的名单之中");
chain.doFilter(request, response);
}
} /**
* 获取配置信息
*/
public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig; //赋值
}
}

JavaWeb学习篇--Filter过滤器的更多相关文章

  1. javaWeb学习之 Filter过滤器----https://www.cnblogs.com/xdp-gacl/p/3948353.html

    https://www.cnblogs.com/xdp-gacl/p/3948353.html

  2. angularjs学习第三天笔记(过滤器第二篇---filter过滤器及其自定义过滤器)

    您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...

  3. JavaWeb学习篇之----自定义标签&&JSTL标签库详解

    今天来看一下自定义标签的内容,自定义标签是JavaWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面 ...

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

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

  5. [转]Servlet的学习之Filter过滤器技术

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

  6. JavaWeb学习篇之----Servlet过滤器Filter和监听器

    首先来看一下Servlet的过滤器内容: 一.Servlet过滤器的概念: ************************************************************** ...

  7. Javaweb学习笔记9—过滤器

      今天来讲javaweb的第9阶段学习.   过滤器,我在本次的思维导图中将过滤器和监听器放在一起总结了,监听器比较简单就不单独写了.   老规矩,首先先用一张思维导图来展现今天的博客内容.     ...

  8. JavaWeb学习篇之----web应用的虚拟目录映射和主机搭建(Tomcat)

    从今天开始来学习JavaWeb的相关知识,之前弄过一段时间JavaWeb的,就是在做毕业设计的时候搞过,但是那时候完全是为了任务去学习,所以效果不好,好多东西都没有深入的研究过,所以接下来的一段时间我 ...

  9. JavaWeb学习笔记--filter开发

    介绍自定义的Filter类必须实现Filter接口,并且实现Filter接口定义的init() doFilter() destory()方法.其中init为初始化,destory为销毁 doFilte ...

随机推荐

  1. SpringSecurity-ChannelProcessingFilter的作用

    ChannelProcessingFilter决定的是web请求的通道,即http或https. 在springsecurity配置文件中添加这样一行 <intercept-url patter ...

  2. 使用RetionalRose根据现有的java工程逆向生成类图

    1.进入RetionalRose选择J2EE模板 2.在菜单栏选择tools->java/j2EE->reverse engineer 3.编辑路径Edit CLASSPATH选择要生成类 ...

  3. 【SQL Server】MS SQL Server中的CONVERT日期格式化大全

    CONVERT 函数将某种数据类型的表达式显式转换为另一种数据类型.SQL Server中 将日期格式化. SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式. 在表中,左侧的两列表示将 ...

  4. P2799国王的魔镜

    链接 想了好久(蒟蒻的不能蒟蒻) 题解: #include<iostream>#include<cstdio>#include<cstring>#include&l ...

  5. 一个简单的springmvc例子 入门(1)

    一直是从事棋牌游戏,平常用的东西 大多数只是使用一些javase的一些 api对spring 这方面 用到的比较少,每次学了都忘,始终记不住.为了 更轻松学习springboot,从新学习了sprin ...

  6. [C#][Quartz]添加监听器

    namespace Quartz.Listener { public class SchedulerListener : SchedulerListenerSupport { private stat ...

  7. centos6和centos7的防火墙的操作

    1:centos6的两种方式 1.1:service方式 查看防火墙状态: [root@centos6 ~]# service iptables status iptables:未运行防火墙. 开启防 ...

  8. MVC 访问静态页面 View 下面放JS

    http://blog.csdn.net/qq_17255515/article/details/53293120

  9. python的json模块介绍

    转载:https://blog.csdn.net/xsj_blog/article/details/51921664 对于数据传递方面,XML是一种选择,还有一种选择是JSON,它是一种轻量级的数据交 ...

  10. 在Java中String类为什么要设计成final?String真的不可变吗?其他基本类型的包装类也是不可变的吗?

    最近突然被问到String为什么被设计为不可变,当时有点懵,这个问题一直像bug一样存在,竟然没有发现,没有思考到,在此总结一下. 1.String的不可变String类被final修饰,是不可继承和 ...