SpringBoot2.0(过滤器,监听器,拦截器)

2023-10-27

一,过滤器

1.1,自定义Filter

  1. 使用Servlet3.0的注解进行配置
  2. 启动类里面增加 @ServletComponentScan ,进行扫描
  3. 新建一个Filter类,implements Filter ,并实现对应接口
  4. @WebFilter 标记一个类为Filter,被spring进行扫描
  5. urlPatterns:拦截规则,支持正则
  6. 控制chain.doFilter的方法的调用,来实现是否通过放行,
    不放行的话,web应用resp.sendRedirect(“/index.html”)
    场景:权限控制,用户登录(非前端后端分离场景)等

1.2,启动类代码

package com.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan  // 扫描select的注解
public class DemoApplication {


    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }

}

1.2,创建filter类和LoginFilter包

在这里插入图片描述

1.2.1,编写loginFilter类 过滤器代码

package com.demo.filter;

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;


@WebFilter(urlPatterns = {"/*"})
@Order(Ordered.HIGHEST_PRECEDENCE)    // 设置过滤器的排序,int类型
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");
//        servletResponse.setCharacterEncoding("UTF-8");
        // 设置响应的字符编码为UTF-8
        servletResponse.setCharacterEncoding("UTF-8");
        // 设置响应的内容类型为text/plain;charset=UTF-8
        servletResponse.setContentType("text/plain;charset=UTF-8");
        // 登录过滤器 有两种情况,需要放行
        // 1,登录请求要放行
        // 2. 不是登录请求,但是有登录token

        String uri = ((HttpServletRequest)servletRequest).getRequestURI();
        System.out.println(uri);
        if (uri.startsWith("/login/")){  // 判断是否以 /login/ 开头
            // 放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            // 从请求中获取token
            String token = ((HttpServletRequest)servletRequest).getParameter("token");
            if (token != null && !"".equals(token)){
                // 其实还需要进行解码,现在是只要有token就放行
                filterChain.doFilter(servletRequest,servletResponse);
            }else {
                PrintWriter pw = servletResponse.getWriter();
                pw.flush();
                pw.write("请先登录");
                pw.close();
            }
        }


    }

    @Override
    public void destroy() {
        System.out.println("销毁过滤器");
    }
}

1.2.2,创建二个Controller类

看看是不是以login开头的放行

第一个controller类为LoginController

package com.demo.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/login")
public class LoginController {

    @RequestMapping("/doLogin")
    public Object doLogin(){
        return "登录接口";
    }
}

在这里插入图片描述

第二个controller类为HelloController

看看不是以login会不会过滤

package com.demo.controller;

import com.demo.bean.Person;
import com.demo.config.BootProperties;
import com.demo.config.SysProperties;
import com.demo.util.ResultUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.xml.crypto.Data;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.UUID;


@RestController
public class HelloController {

    @Autowired
    private BootProperties bootProperties;

    @RequestMapping("/test6")
    public Object test6(){
        return sysProperties.getParam1()+sysProperties.getParam2();
    }
}
// 整个之前的代码试试

在这里插入图片描述
证明过滤了,试试登录后

在这里插入图片描述

二,监听器

2.1,自定义监听器

  1. 自定义Listenter(常用监听器
    servletContextListenter,
    httpSessionListenter,
    HTTPSessionAttributeListenter,
    servletRequestListenter)

2.2,创建listenter包和MyListenter类

在这里插入图片描述

2.2.1,编写MyListenter类 监听器代码

package com.demo.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;


@WebListener
public class MyListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("请求被销毁");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("请求被初始化创建");
    }
}

三,拦截器

3.1,创建自定义拦截器配置类

@Configuration
继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本)
SpringBoot2.X新版本配置拦截器 implements WebMvcConfigurer

3.2,创建配置包config和配置类MyWebMvcConfigurer

在这里插入图片描述

package com.demo.config;

import com.demo.interceptor.Logininterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration  // 添加了Configuration的类,我们称之为配置类
public class MyWebMvcConfigurer implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Logininterceptor()).addPathPatterns("/login/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

3.3,创建拦截器包interceptor和Logininterceptor类

在这里插入图片描述

Logininterceptor类代码

package com.demo.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class Logininterceptor implements HandlerInterceptor {
    // 调用Controller某个方法之前,判断是否要不要处理
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false; // false是拦截, true是不拦截
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

在这里插入图片描述

四,按顺序进行拦截,先注册,先被拦截

拦截器不生效的常见问题:

  1. 是否有加@Configuration
  2. 拦截器是否有路径问题 ** 和 *
  3. 拦截器最后路径一定要 " /** " ,如果是目录的话则是 /*/

Filter
是基于函数回调 doFilter(),而lnterceptor则是基于AOP思想
Filter在只在Servlet前后起作用,而lnterceptor够深入到方法前后,异常抛出前后等

依赖于Servlet容器即web应用中,而lnterceptor不依赖于Servlet容器所以可以运行在多种环境。

在接口调用的声明周期里,lnterceptor可以被多次调用,而Filter只能在容器中初始化调用一次。

Filter和lnterceptor的执行顺序
过滤前 --> 拦截前 --> action(handler) --> 执行 --> 拦截后 --> 过滤后

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot2.0(过滤器,监听器,拦截器) 的相关文章

随机推荐

  • SKNet网路

    1903 SKNet 图 网络描述 SENet是对特征图的通道注意力机制的研究 CBAM 提到了对特征图空间注意力机制的研究 这里 SKNet 针对卷积核的注意力机制研究 SKNet是SENet的加强版 结合了SE opetator Mer
  • Ubuntu 安装 Android Studio 全过程记录(2020年1月)

    不同时期 不同版本安装方法也不同 这是我在2020年1月的安装过程 版本 lubuntu 18 jdk8 202 Android Studio 3 5 3 1 安装jdk 先下载 jdk8 地址 下载 jdk 下载完以后运行安装 sudo
  • 解决:出现 ImportError: cannot import name etree 的问题

    原文 https blog csdn net Amberdreams article details 80548742 昨天晚上写了一个爬虫 竟然犯了一个从未注意的问题 导致运行的时候 不断提示如下错误提示 ImportError cann
  • 反序列化漏洞详解

    目录 一 反序列化漏洞原理 1 相关概念 2 序列化出现场景 3 反序列化攻击分类 4 危害 5 序列化与反序列化过程 二 常用的魔术方法 三 反序列化漏洞的防御 一 反序列化漏洞原理 1 相关概念 序列化 Serialization 将对
  • Git 之 获取远程分支(fetch5种方法),并合并到本地分支(merge和rebase的2种方法)中

    Git 之 获取远程分支 fetch5种方法 并合并到本地分支 merge和rebase的2种方法 中 目录 Git 之 获取远程分支 fetch5种方法 并合并到本地分支 merge和rebase的2种方法 中 一 简单介绍 二 获取远程
  • 在 vue2 中使用 vant2 组件库

    介绍 Vant 是一个轻量 可靠的移动端组件 一 安装 1 1 通过 npm 安装 在现有项目中使用 Vant 时 可以通过 npm 或 yarn 进行安装 Vue 3 项目 安装最新版 Vant npm i vant S Vue 2 项目
  • Windows小技巧9--常见命令、脚本、错误解决方法

    Windows小技巧9 常见命令 脚本 错误解决方法 本文主要记录Windows下常见的快捷键 命令 脚本案例 常见错误及解决方法 后续会以此为基础持续更新补充相关内容 1 常见命令 1 1 Windows下的常见快捷键 1 win R 打
  • Pandas数据库查询更新create_engine用法,以及一些警告及弃用处理

    警示情况 UserWarning pandas only supports SQLAlchemy connectable engine connection or database string URI or sqlite3 DBAPI2
  • vue 插件开发过程

    在使用vue 开发的过程中 有时候可能需要用到this来触发组件 如我们经常用道德loading插件 下面记录了一次插件的开发过程 首先建立一个 vue文件 文件中包含了你插件中的一切逻辑 例如
  • CMake:Tutorial-Step4

    Step4 Installing and Testing 安装和测试 本小结简介简单的安装和测试命令配置 0 安装规则 安装语法很简单 对于MathFunctions我们想要的是安装库和头文件 对于应用程序我们想要的是安装可执行程序和con
  • 跳跃游戏-计蒜客

    给定一个非负整数数组 假定你的初始位置为数组第一个下标 数组中的每个元素代表你在那个位置能够跳跃的最大长度 请确认你是否能够跳跃到数组的最后一个下标 例如 A 2 3 1 1 4 A 2 3 1 1 4 能够跳跃到最后一个下标 输出true
  • 人口生育老龄化政策数据表(1971-2023年)

    人口生育老龄化政策是指政府为应对人口老龄化现象 通过制定一系列政策措施 促进人口增长 优化人口结构和保障老年人福利的过程 人口生育老龄化政策数据表可以进行以下科研 1 人口增长政策 政府采取 鼓励生育的措施 如提供生育津贴 延长产假 提高生
  • RAM、ROM、SRAM、DRAM、SSRAM、SDRAM、FLASH、EEPROM的区别

    RAM Random Access Memory 随机存储器 存储单元的内容可按需随意取出或存入 且存取的速度与存储单元的位置无关的存储器 这种存储器在断电时将丢失其存储内容 故主要用于存储短时间使用的程序 按照存储信息的不同 随机存储器又
  • java英文面试常见问题归纳

    1 Tell me a little about yourself I hava been working as a computer programmger over fives years I have the ability to d
  • Python-reduce()

    functools reduce function iterable initializer 将两个参数的 function 从左至右积累地应用到 iterable 的条目 以便将该可迭代对象缩减为单一的值 例如 reduce lambda
  • vb基于SC结构服装专卖店设计与实现

    摘 要 本论文描述了 服装专卖店店管理系统 的设计与实现 在我国数量众多的企业中 中小企业占了绝大多数 这些企业也不可避免地要加入国际化企业的竞争行列 而实现企业信息化是参与挑战的必要条件 但是中小企业的多样性及其灵活多变的经营方式 加上相
  • 【Python 3.7】立方:数字的三次方被称为其立方。请绘制一个图形,显示前 5个整数的立方 值,再绘制一个图形,显示前 5000个整数的立方值。

    题目 Python 3 7 立方 数字的三次方被称为其立方 请绘制一个图形 显示前 5个整数的立方值 再绘制一个图形 显示前 5000个整数的立方值 前 5个整数的立方值的程序为 import matplotlib pyplot as pl
  • TPS5430设计24v转15v电源

    目录 前言 一 芯片输入输出特性 1 输出电压 2 输出电流 3 输出功率 二 芯片各引脚的设计和外围电路元器件的选型 1 ENA脚 2 VIN脚的输入电容 3 输入纹波 4 分压电阻 5 输出电感 6 输出电容 7 BOOT电容器 8 环
  • linux基本命令,一份就够了,初学者指南,基于centos和redhat

    一 文件或者文件本身 ls a 显示隐藏文件 l 长格式显示 h 人性化显示 显示文件大小 d 显示目录本身非目录里面的内容 touch 可改变文件时间戳 mkdir 创建多个目录mkdir a b c p 创建多级目录 mkdir a b
  • SpringBoot2.0(过滤器,监听器,拦截器)

    目录 一 过滤器 1 1 自定义Filter 1 2 启动类代码 1 2 创建filter类和LoginFilter包 1 2 1 编写loginFilter类 过滤器代码 1 2 2 创建二个Controller类 二 监听器 2 1 自