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

news2024/10/7 18:32:20

目录

  • 一,过滤器
    • 1.1,自定义Filter
    • 1.2,启动类代码
    • 1.2,创建filter类和LoginFilter包
      • 1.2.1,编写loginFilter类 过滤器代码
      • 1.2.2,创建二个Controller类
  • 二,监听器
    • 2.1,自定义监听器
    • 2.2,创建listenter包和MyListenter类
      • 2.2.1,编写MyListenter类 监听器代码
  • 三,拦截器
    • 3.1,创建自定义拦截器配置类
    • 3.2,创建配置包config和配置类MyWebMvcConfigurer
    • 3.3,创建拦截器包interceptor和Logininterceptor类
  • 四,按顺序进行拦截,先注册,先被拦截

一,过滤器

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) --> 执行 --> 拦截后 --> 过滤后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于虚拟仿真技术的汽车燃油泵控制

在当前激烈的竞争环境下,汽车行业正在加速产业和技术更迭,整车厂对大型ECU嵌入式控制系统和软件的需求迫在眉睫。 然而,复杂而庞大的汽车系统往往由多个物理系统组成,系统所对应的模型都需要在不同的领域实现:发动机、…

Leetcode算法入门与数组丨1. 数据结构与算法简介

文章目录 前言1 数据结构与算法1.1 数据结构1.2 算法 2 算法复杂度2.1 算法复杂度简介2.2 时间复杂度2.3 空间复杂度 3 总结 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客以及接下来几篇将会是一个 入门型 的文章,主要是自己学习的一个…

Leaflet入门,原生html网页如何使用Leaflet地图

前言 本章讲解如何不使用vue或react的情况下,在原生html网页中使用Leaflet地图加载地图的功能。 以高德地图xyz瓦片地图为例。 示例演示效果 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到…

【直接运行TS文件的三种方法】

直接运行TS文件的三种方法 文章目录 直接运行TS文件的三种方法法一:将 ts 编译成 js,然后运行 js 文件法二:用 ts-node 直接运行 ts法三:webstorm中直接运行ts(TypeScript) 法一:将 ts 编译成 js,然后运行 …

SpringBoot项目--电脑商城【显示购物车列表】

1.持久层 1.1规划需要执行的SQL语句 这里需要将商品表和购物车表进行连表查询 显示某用户的购物车列表数据的SQL语句大致是 多表查询如果字段不重复则不需要显示的表面表名 selectcid, #日后勾选购物车商品模块需要用到cid来确定勾选的是购物车表的哪一条数据uid, #感觉没必要…

教你如何利用人工智能技术提升气象、海洋、水文领域工作学习效率

查看原文>>>基于Python机器学习、深度学习提升气象、海洋、水文领域实践应用能力 Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库…

小程序 navigateBack 携带参数返回的三种方式(详细)

如果觉着主图好看,点个赞,你早晚也会看到这么好看的景色! 第一种方式 getCurrentPages 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。不要尝试修改页面栈,会导致路由以及页面状态错误。不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page …

选择什么电容笔比较好?主动式电容笔推荐

随着科学技术的飞速发展,越来越多人把纸质转换为电子版了,许多小伙伴会入手电容笔来提高自己的生产效率。无论是写作还是绘画。都在使用电容笔。apple pencil的昂贵众所周知,而现在线上的电容笔多得让我们眼花缭乱,再从众多品牌中…

测试平台部署三——Nginx

测试平台部署——Nginx 一、nginx部署1、nginx的作用:2、案例1二、django静态文件配置和部署1、nginx工作原理2、反向代理一、nginx部署 1、nginx的作用: 静态文件服务器和反向代理django服务 进入nginx容器中 sudo docker run --rm -it nginx:alpine /bin/sh

VPN都容易受到泄露流量的TunnelCrack攻击

导读研究人员近日发现,影响市面上大多数VPN产品的几个漏洞可以被攻击者用来读取用户流量、窃取用户信息,甚至攻击用户设备。 我们实施的攻击从计算上来说开销并不大,这意味着任何拥有适当网络访问权限的人都可以执行攻击,而且攻击…

Seekbar细节

Seekbar可以自定义thumb图标,但是有时候发现thumb没有展示完全,或者图标周围显示的是背景色,此时就需要设置一些属性 android:background"null" android:thumbOffset"0dp" android:splitTrack"false" 设置an…

WSL Ubuntu设置中文语言环境

问题现象:终端、Edge、VScode等软件乱码 在这里插入图片描述 解决方法 ① 安装中文语言包 sudo apt-get install language-pack-zh-han*② 运行语言支持检查 sudo apt install $(check-language-support)③ 修改相关配置文件 sudo gedit /etc/default/locale替…

2023年9月DAMA-CDGA/CDGP数据治理认证报名到这错不了

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

如何利用Python中实现高效的网络爬虫

各位大佬们!今天我要和大家分享一个有关Python的技巧,让你轻松实现高效的网络爬虫!网络爬虫是在互联网时代数据获取的一项关键技能,而Python作为一门强大的编程语言,为我们提供了许多方便而高效的工具和库。让我们一起…

XSC63-300-S-CB、XSC80-400-S-CA、XSC100-700-S-LB方型气缸

XQVB40-16、XQ-VB63-16、XQ-VB100-16倍压增压阀 QCK2400、QCK2400A、QCK2422、QCK2422A磁性开关 AL-07R、AL-30R、KT-50R、AL-03R、AL-20R、AL-72R磁性开关 XSC32-40-S-LB、XSC40-100-S-FA、XSC50-200-S-FB、XSC63-300-S-CB、XSC80-400-S-CA、XSC100-700-S-LB方型气缸 QSC3…

DC电源模块对设计和布线的重要性

BOSHIDA DC电源模块对设计和布线的重要性 在电子设备中,DC电源模块的作用是将市电或其他源的交流电转换成适合设备使用的直流电,因此,DC电源模块是电子设备中不可或缺的一个部分。在实际设计和应用中,DC电源模块的设计和布线显得…

智慧燃气:智慧燃气发展的讨论

关键词:智慧燃气、智能管网、智慧燃气系统、智能燃气、智慧燃气建设、智慧燃气平台 智慧燃气是什么? 智慧燃气是以智能管网建设为基础,利用先进的通信、传感、储能、微电子、数据优化管理和智能控制等技术,实现天然气与其他能源…

四化智造MES(WEB)与金蝶云星空对接集成原材料/标准件采购查询(待采购)连通采购订单新增(其他采购订单行关闭-TEST)

四化智造MES(WEB)与金蝶云星空对接集成原材料/标准件采购查询(待采购)连通采购订单新增(其他采购订单行关闭-TEST) 数据源系统:四化智造MES(WEB) MES系统是集成生产管理、品质管理、设备管理、BI数据中心、…

【赠书活动】考研备考书单推荐

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

比亚迪用USB Server,实现U盾远程连接

在过去,比亚迪的资金管理系统需要与多个银行进行银企直连对接,而银企直连的前置机程序是部署在物理机上的。为了推进企业虚拟化转型,比亚迪决定将前置机程序迁移到虚拟机中。然而,面临的问题是各银行的专用Ukey无法在虚拟机中被识…