Java Web开发中过滤器和监听器使用详解

目录
  • 1 Filter
    • 1.1 Filter简介
    • 1.2 Filter的快速入门
      • 1.2.1 创建Filter类
      • 1.2.2 访问index.jsp
    • 1.3 Filter的拦截路径的配置
    • 1.4 过滤器链
      • 1.4.1 过滤器链简介
      • 1.4.2 过滤器链的例子
  • 2 Listener
    • 2.1 概念
    • 2.2 监听器的使用

1 Filter

1.1 Filter简介

  • Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
  • 过滤器可以把资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器一般完成一些通用的操作,比如权限控制、统一编码处理、敏感字符处理等等
  • Filter流程图

1.2 Filter的快速入门

Filter和Servlet很相像,步骤也是一样的。

1.2.1 创建Filter类

  • 新建一个Filter.java文件,实现Filter接口
  • 实现接口后,重写其三个方法
  • 其中都chain.doFilter()是放行的方法
  • inti、和destory都是生命周期的函数
  • @WebFilter()配置的是拦截的路径,当访问这个路径的时候,Filter会被调用

注意:此处导入的Filter 是Javax Servlet包下的

@WebFilter("/index.jsp")
public class DemoFilter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("1.init.......");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("2.放行前.....");
        chain.doFilter(request,response);
        System.out.println("4.放行后.....");
    }
    @Override
    public void destroy() {
        System.out.println("5.destory....");
    }
}

1.2.2 访问index.jsp

由上图分析所致,当我们访问index.jsp的时候,会调用Filter,那么我们用代码检验一下上面的流程图。

**按照流程图,正确的输出应该是1、2、3、4、5,**访问一下index.jsp

<html>
<body>
<h2>Hello World!</h2>
<%
    System.out.println("3. 我是index.jsp ......");
%>
</body>
</html>

结果证明流程图是正确的!

1、放行后访问对应资源,资源访问完成后,还会回到Filter吗?

2、如果回到Filter中,是重头执行还是执行放行后的逻辑呢?

放行后的逻辑

1.3 Filter的拦截路径的配置

配置在**@WebFilter(“”)**中,主要有以下四类

  • 拦截具体的资源路径:/index.jsp,只有访问index.jsp的时候才会被拦截
  • 目录拦截:/user/*,访问/user下的所有资源,都会被拦截
  • 后缀名拦截:*.jsp 访问后缀名为jsp的资源,都会被拦截
  • 拦截所有:/* 访问所有的资源,都会被拦截

1.4 过滤器链

1.4.1 过滤器链简介

一个web路径,可以配置多个过滤器,这多个过滤器就被称为过滤器链。

流程图如下:

见图知意:

当web应用有一个A一个B过滤器组成的过滤器链时,A放行后,会来到B过滤器。只有两个过滤器都放行,才会访问到相应的资源。随后,按照怎么来的,怎么返回的方式,执行B、A的放行后逻辑

注意:

为什么是按照A、B,而不是B、A呢?

你以为我瞎说的?其实不然,**排序方式即为按照字符串排序,**先后执行。就是字符串排序小的限制性。

1.4.2 过滤器链的例子

由上面的流程图可知,浏览器会按照DemoFilter01 DemoFilter02 的方式 访问过滤器链,所以我们配置了两个过滤器类。

@WebFilter("/index.jsp")
public class DemoFilter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("DemoFilter01 init.......");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("1.DemoFilter01 doFilter.....");
        chain.doFilter(request,response);
        System.out.println("5.DemoFilter01 doFilter end.....");
    }
    @Override
    public void destroy() {
        System.out.println("DemoFilter01 destory....");
    }
}
@WebFilter("/index.jsp")
public class DemoFilter02 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("DemoFilter02 init......");
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("2.DemoFilter02 doFilter....");
        chain.doFilter(request,response);
        System.out.println("4.DemoFilter02 doFilter end....");
    }
    @Override
    public void destroy() {
        System.out.println("DemoFilter02 destory.....");
    }
}
<html>
<body>
<h2>Hello World!</h2>
<%
    System.out.println("3. index.jsp ......");
%>
</body>
</html>

效果图如下:

2 Listener

2.1 概念

  • Listener表示监听器,是JavaWeb三大组件之一。
  • 监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
  • Listener分类:Javaweb提供了8个监听器(接口)

2.2 监听器的使用

@WebListener
public class DemoListener01 implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized....");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed....");
    }
}

当启动Tomcat的时候,会自动调用!

ntln(“contextInitialized…”);

}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("contextDestroyed....");
}

}

当启动Tomcat的时候,会自动调用!

![image-20220916172910166](https://img-blog.csdnimg.cn/img_convert/7d4ee33099f9d23fddadcfc5140ab6f4.png)

到此这篇关于Java Web开发中过滤器和监听器使用详解的文章就介绍到这了,更多相关JavaWeb过滤器和监听器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaWeb中过滤器Filter的用法详解

    目录 过滤器Filter 处理顺序 使用场景 自定义过滤器 源码分析 FilterDef FilterMap 初始化过滤器 创建过滤器链 ApplicationFilterChain 执行过滤器链 过滤器Filter 过滤器通常对一些web资源进行拦截,做完一些处理器再交给下一个过滤器处理,直到所有的过滤器处理器,再调用servlet实例的service方法进行处理.过滤器可以对request进行处理也可以对response进行处理. 处理顺序 如果过滤器链顺序如上图所示,那么对request请

  • Java Filter过滤器的使用教程

    目录 一.过滤器的使用以及实现原理 当前的oa项目还存在什么缺陷 Filter作用与执行原理 过滤器怎么写 过滤器的调用顺序 Filter的生命周期 二.责任链设计模式改造oa项目 一.过滤器的使用以及实现原理 当前的oa项目还存在什么缺陷 ①对于DeptServlet.EmpServlet.OrderServlet,每一个Servlet都是处理自己相关的业务:在这些Servlet执行之前都是需要判断用户是否登录了.如果用户登录了,可以继续操作,如果没有登录,需要用户登录. ②这段判断用户是否登

  • Java微服务Filter过滤器集成Sentinel实现网关限流过程详解

    目录 Gateway-过滤器Filter 局部路由过滤器 使用局部过滤器 全局过滤器 使用全局过滤器 集成Sentinel实现网关限流 网关限流 API分组限流 Gateway-过滤器Filter 过滤器就是在请求的传递过程中,对请求和响应做一些手脚. 在Gateway中, Filter的生命周期只有两个:“pre”和“post”". .PRE:这种过滤器在请求被路由之前调用.我们可利用这种过滤器实现身份验证.在集群中选择请求的微服务.记录调试信息等. .POST:这种过滤器在路由到微服务以后执

  • Java利用过滤器实现完善登录功能

    目录 1.问题引入 2.解决思路 3.代码实现 3.1 定义登录校验过滤器 3.2 开启组件扫描 1.问题引入 我们已经完成了后台系统的登录功能开发,但是目前还存在一个问题,就是用户如果不登录,直接访问系统首页面,照样可以正常访问. 很明显,上面这种情况并不合理,我们希望看到的效果应该是,只有登录成功后才可以访问系统中的页面,如果没有登录, 访问系统中的任何界面都直接跳转到登录页面. 2.解决思路 使用 过滤器或者拦截器来实现,在过滤器.拦截器中拦截前端发起的请求,判断用户是否已经完成登录,如果

  • 详解JavaWeb过滤器 Filter问题解决

    目录 基本概念 1.过滤器概述 2.使用过滤器解决中文编码异常问题 3.使用过滤器实现用户登录权限拦截 基本概念 1. Filter 过滤器它是 JavaWeb 的三大组件之一. 三大组件分别是: Servlet 程序. Listener 监听器. Filter 过滤器2. Filter 过滤器它是 JavaEE 的规范. 也就是接口3. Filter 过滤器它的作用是: 拦截请求, 过滤响应        过滤器的三要素: ①拦截 过滤器之所以能够对请求进行预处理,关键是对请求进行拦截,把请求

  • Java Web开发中过滤器和监听器使用详解

    目录 1 Filter 1.1 Filter简介 1.2 Filter的快速入门 1.2.1 创建Filter类 1.2.2 访问index.jsp 1.3 Filter的拦截路径的配置 1.4 过滤器链 1.4.1 过滤器链简介 1.4.2 过滤器链的例子 2 Listener 2.1 概念 2.2 监听器的使用 1 Filter 1.1 Filter简介 Filter表示过滤器,是JavaWeb三大组件(Servlet.Filter.Listener)之一. 过滤器可以把资源的请求拦截下来,

  • Java开发中为什么要使用单例模式详解

    一.什么是单例模式? 单例设计模式(Singleton Design Pattern)理解起来非常简单.一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式. 二.实战案例一:处理资源访问冲突 我们先来看第一个例子.在这个例子中,我们自定义实现了一个往文件中打印日志的 Logger 类.具体的代码实现如下所示: public class Logger { private FileWriter writer; public Logger() {

  • Java web拦截器inteceptor原理及应用详解

    这篇文章主要介绍了java web拦截器inteceptor原理及应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.简介 java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性. Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理.它依赖于具体的接口,在运行期间动态生成字节码. 拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发

  • Android程序开发中单选按钮(RadioGroup)的使用详解

    在还没给大家介绍单选按钮(RadioGroup)的使用,先给大家展示下效果图吧: xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

  • Android 开发中使用Linux Shell实例详解

    Android 开发中使用Linux Shell实例详解 引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android Shell工具代码,在这里分享一下. Shell核心代码 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.

  • Java多线程开发工具之CompletableFuture的应用详解

    做Java编程,难免会遇到多线程的开发,但是JDK8这个CompletableFuture类很多开发者目前还没听说过,但是这个类实在是太好用了,了解它的一些用法后相信你会对它爱不释手(呸渣男,咋对谁都爱不释手呢),好了我先简单举个列子,告诉你用它有多好.Single Dog拿一个Appointment来举个列子,如下: /** * 女神化完妆之后,还需要一小会选衣服,不过分吧. * 也就是说我们现在有2个异步任务,第一个是化妆,第二个是选衣服. * 选衣服要在化妆完成之后进行,这两个任务是串行

  • IOS 开发中画扇形图实例详解

    IOS 开发中画扇形图实例详解 昨天在做项目中,遇到一个需要显示扇形图的功能,网上搜了一下,发现code4app里面也没有找到我想要的那种类似的效果,没办法了,只能自己学习一下如何画了. 首先我们需要了解一个uiview的方法 -(void)drawRect:(CGRect)rect 我们知道了这个方法,就可以在自定义UIView的子类的- (void)drawRect:(CGRect)rect里面绘图了,关于drawrect的调用周期,网上也是一找一大堆,等下我会整理一下,转载一篇供你们参考.

  • Web应用中设置Context Path案例详解

    URL:http://hostname.com/contextPath/servletPath/pathInfo Jetty 如果没有contextPath,则默认使用root上下文,root上下文的路径为"/". warName.war 在没有XML IoC文件的情况下: 如果WAR文件名是myapp.war,那么上下文路径是:/myapp: 如果WAR文件名是ROOT.war,那么上下文路径是:/: 如果WAR文件名是ROOT-foobar.war,那么上下文路径是/,虚拟host

  • 开发中避免延时操作技巧详解

    目录 前言 使用延时的场景 获取view的宽高 定时查询服务器结果 广播顺序 延时初始化 使用延时的场景 小心使用延时 前言 开发中我们或多或少会涉及到一些场景需要使用延时操作,而延时操作其实并不是一个很好的选择,并不是一个很好的方案,因为它不可控,也可能产生时序的逻辑问题.这次就来盘点一些使用延时操作的场景和如何去避免,本次内容比较基础. 使用延时的场景 在刚接触开发的时候,我们无脑解决问题的方案基本只有两种,异常捕获和延时.异常捕获容易理解,当碰到崩溃又分析不出原因时,往往加个try-cat

随机推荐