前置内容:

1、 过滤器Filter

1.1 Filter快速入门

  • 使用步骤

    1. 定义类并实现Filter接口
    2. 定义@WebFilter注解,配置拦截路径
    3. 放行
    4. (请求其他资源)
  • Demo

    package priv.dandelion.controller.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException; @WebFilter("/*")
    public class FilterDemo implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { } @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 放行前逻辑
    System.out.println("FilterDemo..."); // 放行
    filterChain.doFilter(servletRequest, servletResponse); // 放行后逻辑
    } @Override
    public void destroy() { }
    }

1.2 Filter执行流程

  1. 浏览器发送请求到服务器
  2. Filter拦截请求
  3. 执行放行前逻辑
  4. 放行请求
  5. 访问对应资源
  6. 执行放行后逻辑
  7. 服务器对浏览器做出响应

1.3 Filter使用细节

  • 拦截路径配置

    • 拦截具体资源:/index.jsp
    • 目录拦截:/user/*
    • 后缀名拦截:*.jsp
    • 拦截所有:/*
  • 过滤器链

    • 一个Web应用可以配置多个过滤器,多个过滤器成为过滤器链

      • 多个过滤器逐一放行
      • 请求资源
      • 按照递归顺序执行过滤器链的放行后逻辑
    • 过滤器链的过滤顺序

      • 若使用注解配置过滤器,则按照全类名进行排序,即为过滤器链的执行顺序
      • 可在XML中配置顺序

1.4 案例

  • 需求

    • 访问服务器资源时,需要先进行登录验证,如果没有登录则自动跳转到登录页面
  • 方式

    • 判断请求资源是否和登录注册相关,若是则放行
    • 判断Session中是否有User对象,若有则放行,否则跳转到登录
  • 环境准备

    环境和案例框架见:用户登录注册案例

  • 代码实现

    package priv.dandelion.controller.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException; @WebFilter("/*")
    public class LoginFilter implements Filter { @Override
    public void init(FilterConfig filterConfig) throws ServletException { } @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; // 判断访问的资源是否和登录注册相关
    String[] urls = {"/login.jsp", "/register.jsp", "/imgs/", "/css/", "/login", "/register", "/checkCode"};
    // 获取当前访问资源的路径
    String requestURL = req.getRequestURL().toString(); for (String url : urls) {
    if (requestURL.contains(url)) {
    // 若为和登录注册相关的资源,则放行并直接结束过滤器执行
    System.out.println(url);
    filterChain.doFilter(req, servletResponse);
    return;
    }
    } // 判断Session中是否有user
    // 获取Session
    Object user = req.getSession().getAttribute("user"); if (user != null) {
    // 放行
    System.out.println("已登录,放行"+ user);
    filterChain.doFilter(servletRequest, servletResponse);
    } else {
    // 存储提示信息,拦截跳转到登录页面
    System.out.println("未登录,将跳转到登录页面");
    req.setAttribute("login_msg", "您尚未登录!");
    req.getRequestDispatcher("/login.jsp").forward(req, servletResponse);
    } } @Override
    public void destroy() { }
    }

2、 监听器Listener概述

2.1 概述

  • Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

  • 监听器可以监听就是在 applicationsessionrequest 三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

    applicationServletContext 类型的对象。

    ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

2.2 分类

监听器分类 监听器名称 作用
ServletContext监听 ServletContextListener 用于对ServletContext对象进行监听(创建、销毁)
:: ServletContextAttributeLintener 用于对ServletContext对象中的属性的监听(增删改属性)
Session监听 HttpSessionListener 对Session对象的整体状态监听(创建、销毁)
:: HttpSessionAttributeLintener 对Session对象中的属性的监听(增删改属性)
:: HttpSessionBindingListener 监听对象与Session的绑定和解除
:: HttpSessionActivationListener 对Session数据的钝化和活化的监听
Request监听 ServletRequestListener 对Request对象的监听(创建、销毁)
:: ServletRequestAttributeListener 对Request对象中属性的监听(增删改属性)

2.3 代码演示

package priv.dandelion.controller.Listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener; @WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
// 加载资源
System.out.println("ContextLoaderListener initialized...");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
// 释放资源
System.out.println("ContextLoaderListener destroyed...");
}
}

Filter拦截器从入门到快速上手与Listener监听器概述的更多相关文章

  1. Flask入门和快速上手

    目录 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用--hello word 非法导入名称 调试模式 路由 唯一的 UR ...

  2. java:(json,ajax,path,Oracle的分页实例,Filter拦截器)

    1.json: <%@ page language="java" import="java.util.*" pageEncoding="UTF- ...

  3. Java filter拦截器的使用

    1.web.xml配置 <!-- 验证是否登录 拦截功能 --> <filter> <filter-name>isLogin</filter-name> ...

  4. spring filter拦截器

    实现的功能:判断用户是否已登录,未登录用户禁止访问任何页面或action,自动跳转到登录页面.比较好的做法是不管什么人都不能直接访问jsp页面,要访问就通过action,这样就变成了一个实实在在的权限 ...

  5. pc/移动端(手机端)浏览器的直播rtmp hls(适合入门者快速上手)

    一.直播概述 关于直播,大概的过程是:推流端——>源站——>客户端拉流,用媒介播放 客户端所谓的拉流就是一个播放的地址url,会有多种类型的流: 视频直播服务目前支持三种直播协议,分别是R ...

  6. Filter拦截器和Listen监听器

    Filte过滤器概述 1   过滤器是一个驻留在服务器端的Web组件,可以截取用户端和资源之间的请求响应信息,并对信息进行过滤 过滤的工作流程. 过滤器作用描述 1  ,在HttpServletReq ...

  7. MVC5-11 浅谈拦截器

    Filter拦截器 Aop是MVC的主要设计方式之一,而微软也希望我们在使用MVC的时候更好的使用拦截器来进行切面编程.拦截器则是Mvc中的一大亮点与重点 AOP(面向切面)编程已经广泛应用在各个项目 ...

  8. 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行

    我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...

  9. SpringMVC拦截器(慕课网)

    拦截器:通过统一拦截从浏览器发往服务器的请求来完成功能的增强 使用场景:解决请求的共性问题 如:乱码.权限验证 基本工作原理:拦截器和过滤器的工作原理相似 乱码问题:使用Spring过滤器(Filte ...

  10. SpringBoot------自定义拦截器

    1.添加pom.xml使用的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...

随机推荐

  1. Oracle数据库下的DDL、DML、DQL、TCL、DCL

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  2. Docker 必知必会2----跟我一步步来执行基本操作

    通过前文(https://www.cnblogs.com/jilodream/p/18177695)的了解,我们已经大致明白了什么是docker,为什么要用docker,以及docker的基本设计思路 ...

  3. UE4 C++调用C# DLL(DllExport方法)

    之前看见园子里一篇C++调用C#的文章,参考后拿UE试一下.刚开始尝试了C# dll > CLR C++ DLL > Native C++ DLL的做法, 原生环境下是可以的,但是到UE4 ...

  4. 网络安全—模拟ARP欺骗

    文章目录 网络拓扑 安装 使用 编辑数据包 客户机 攻击机 验证 仅做实验用途,禁止做违法犯罪的事情,后果自负.当然现在的计算机多无法被欺骗了,开了防火墙ARP欺骗根本无效. 网络拓扑 均使用Wind ...

  5. 4G EPS 第四代移动通信系统

    目录 文章目录 目录 4G EPS 4G EPS 4G(the 4th generation mobile communication technology,第四代移动通信技术)提供了 3G 不能满足 ...

  6. angular 16 路由守卫更新

    在 angular16 中守卫使用方式进行了更新,route 守卫被弃用(取消了CanActivate的使用),新增了功能性守卫(CanActivateFn),支持 inject 注入,官网提供了一个 ...

  7. kubernetes运行应用Controller3之Job、CronJob详解

    成功启动一个Job 1.Job.spec.template.metadata,没有空格符的错误 [machangwei@mcwk8s-master ~]$ cat mcwJob1.yml apiVer ...

  8. mysql 命令行安装方式

    一:下载 先到 mysql 官方网站下载:https://dev.mysql.com/downloads/mysql/ 点击直接下载: 解压到目录:D:\mysql-8.0.19-winx64  如图 ...

  9. 鸿蒙HarmonyOS实战-Stage模型(线程模型)

    前言 线程是计算机中的一种执行单元,是操作系统进行调度的最小单位.它是进程中的实际运行单位,每个进程可以包含多个线程.线程可以理解为进程中的一个执行流,它独立运行,拥有独立的栈和寄存器,但共享进程的资 ...

  10. golang开发 gorilla websocket的使用

    很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的.也是最简单的socket服务就 ...