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

目录

  • 一,过滤器
    • 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化过滤器");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("doFilter");
//        servletResponse.setCharacterEncoding("UTF-8");// 设置响应的字符编码为UTF-8servletResponse.setCharacterEncoding("UTF-8");// 设置响应的内容类型为text/plain;charset=UTF-8servletResponse.setContentType("text/plain;charset=UTF-8");// 登录过滤器 有两种情况,需要放行// 1,登录请求要放行// 2. 不是登录请求,但是有登录tokenString uri = ((HttpServletRequest)servletRequest).getRequestURI();System.out.println(uri);if (uri.startsWith("/login/")){  // 判断是否以 /login/ 开头// 放行filterChain.doFilter(servletRequest,servletResponse);}else {// 从请求中获取tokenString 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();}}}@Overridepublic 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 {@Autowiredprivate 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 {@Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {System.out.println("请求被销毁");}@Overridepublic 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 {@Overridepublic 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某个方法之前,判断是否要不要处理@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return false; // false是拦截, true是不拦截}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}@Overridepublic 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.rhkb.cn/news/130363.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 操作系统云服务器安装部署 Tomcat 服务器详细教程

Tomcat 基本概述 Tomcat 服务器是Apache软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。它是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用…

DNS (Domain Name System) 域名解析过程

一、域名与IP地址 通常情况下一台电脑都会有一个IPv4和IPv6地址(由数字和字母组成,难以记忆),所以日常访问网站时我们通常都是采用输入域名(方便记忆)的方式来访问。 二、域名结构树 www 主机名bilibil…

宋浩高等数学笔记(十二)无穷级数

完结,宋浩笔记系列的最后一更~ 之后会出一些武忠祥老师的错题&笔记总结,10月份就要赶紧做真题了

End-to-End Object Detection with Transformers(论文解析)

End-to-End Object Detection with Transformers 摘要介绍相关工作2.1 集合预测2.2 transformer和并行解码2.3 目标检测 3 DETR模型3.1 目标检测集设置预测损失3.2 DETR架构 摘要 我们提出了一种将目标检测视为直接集合预测问题的新方法。我们的方法简化了检测流程&#xff0c…

C# OpenVino Yolov8 Seg 分割

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp;namespace OpenVino_Yolov8_Demo {public…

WorkPlus AI助理,基于ChatGPT的企业级知识问答机器人

随着人工智能技术的发展,WorkPlus AI助理以ChatGPT对话能力为基础,将企业数据与人工智能相结合,推出了面向企业的知识问答机器人。这一创新性的解决方案帮助企业高效管理和利用自身的知识资产,助力企业级人工智能的构建。与传统的…

腾讯云和阿里云2核2G服务器租用价格表对比

2核2G云服务器可以选择阿里云服务器或腾讯云服务器,腾讯云轻量2核2G3M带宽服务器95元一年,阿里云轻量2核2G3M带宽优惠价108元一年,不只是轻量应用服务器,阿里云还可以选择ECS云服务器u1,腾讯云也可以选择CVM标准型S5云…

如何在 Ubuntu 上安装和使用 Nginx?

ginx(发音为“engine-x”)是一种流行的 Web 服务器软件,以其高性能和可靠性而闻名。它是许多流行网站使用的开源软件,包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。 它以…

2.linux的组管理和权限管理

一、组管理 1.Linux组的介绍 在linux中每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者,所有组,其他组的概念 ①所有者 ②所在组 ③其他组 ④改变用户所在组 2.文件/目录 所有者 哪个用户创建了文件,就…

为什么市面的北斗定位卡都不用5G传输?

当下最流行的通讯产品当属5G产品,数据传输高速率、低延时和大容量的特点,更加适合自动驾驶、ARVR、远程医疗等场景。目前的4G在GPS定位产品上已经远远满足数据传输要求,加上5G模组价格较高,目前国内市面上,几乎没有采用…

java类加载过程

简介 我们知道java程序运行时,.java文件会被编译器变成成.class文件。 类加载机制指的是将这些.class文件中的二进制数据读入到内存中,并对数据进行校验,解析和初始化。 最终,每一个类都会在方法区保存一份它的元数据&#xff…

crAPI靶场学习记录

靶场搭建 [靶场下载地址](我fork了一份) docker安装,笔者是用的wsldocker. [lab0:**初始账户 **] 注册一个账户,邮箱为[APIqq.com],密码为Admin123 登陆后访问对应IP的8025端口,接收邮件获取车辆信息。 [lab1:**访问其它用户车…

【区块链 | IPFS】IPFS节点搭建、文件上传、节点存储空间设置、节点上传文件chunk设置

一、创建ipfs节点 通过ipfs init在本地计算机建立一个IPFS节点 本文有些命令已经执行过了,就没有重新初始化。部分图片拷贝自先前文档,具体信息应以实物为准 ipfs init initializing IPFS node at /Users/CHY/.ipfs generating 2048-bit RSA keypair.…

es滚动查询分析和使用步骤

ES在进行普通的查询时,默认只会查询出来10条数据。我们通过设置es中的size可以将最终的查询结果从10增加到10000。如果需要查询数据量大于es的翻页限制或者需要将es的数据进行导出又当如何? Elasticsearch提供了一种称为"滚动查询"&#xff08…

MATLAB R2018b安装教程

目录 一、软件下载 二、软件介绍 三、安装须知 四、安装步骤 【最后】 🎈个人主页:库库的里昂 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:MATLAB基础及应用🤝希望作者的文章能…

蚂蚁集团SQLess 开源,与内部版有何区别?

当我们使用关系型数据库时,SQL 是联系起用户和数据库的一座桥梁。 SQL 是一种高度非过程化的语言,当我们在编写SQL 时,表达的是想要什么数据,而不是怎么获取数据。因此,我们往往更关心SQL 有没有满足业务逻辑&#xff…

Ei、Scopus双检索 | 2024年第三届人工智能与机器学习前沿国际会议(FAIML 2024)

会议简介 Brief Introduction 2024年第三届人工智能与机器学习前沿国际会议(FAIML 2024) 会议时间:2024年4月26日-28日 召开地点:中国宜昌 大会官网:www.faiml.org FAIML 2024将围绕“人工智能与机器学习”的最新研究领域而展开,为…

C++标准模板库 STL——string的使用以及模拟实现

前言 STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 为什么学习string类? C语言中,字符串是以’\0’结…

电阻和电容

目录 1、常见的电阻器 2、电容 ​编辑 1、常见的电阻器 对于电阻需要了解三个参数(查询电阻的数据手册): 1、封装:就是电阻的尺寸或者大小,看焊在你的pcb板上是否合适。 2、标称:电阻的电阻大小、精度、…

小程序分销机制介绍,小程序二级分销功能有哪些?

为什么有越来越多的用户选择使用小程序?跟“高大上”的APP相比,小程序不仅可以减少下载安装的复杂流程,还具备操作便捷、沉淀私域数据的优势。蚓链分销小程序具备裂变二维码、实时分佣、分销身份升级、层级分佣、商品个性化佣金设定等功能&am…