SpringBoot的filter过滤器

news2024/11/27 10:42:58

SpringBoot的filter过滤器

目录

  • SpringBoot的filter过滤器
    • 一、过滤器的作用和概述
      • 1.1 简述
      • 1.2 使用场景
    • 二、自定义过滤的两种方式
      • 2.1 第一种方式
        • 2.1.1 启动类增加注解@ServletComponentScan
        • 2.1.2 定义一个filter类
        • 2.1.3. 测试
      • 2.2 第二种方式
        • 2.2.1 自定义fitler类
        • 2.2.4 在启动类中进行配置
        • 2.4.3 第二种方式的另一种写法
        • 2.4.4. 测试
      • 2.3 过滤器的小案例
        • 2.3.1 场景描述
        • 2.3.2 Controller层
        • 2.3.3 启动类 添加注解:@ServletComponentScan //添加过滤器使用
        • 2.3.4自定义过滤器类UserLoginFilter.java
        • 2.3.5 templates下的index页面
        • 2.3.6被拦截后重定向的页面
        • 2.3.7 测试

一、过滤器的作用和概述

1.1 简述

人—>检票员(filter)—> 电影院。

注意:配置多个filter的时候,要设置编号id,值越小,优先级越高,越先执行。

在3.0之后新增@WebFilter注解,当使用注解配置多个Filter时,用户无法控制其执行顺序,此时Filter过滤的顺序是按照Filter的类名来控制的,按自然排序的规则。
在这里插入图片描述

1.2 使用场景

场景:权限控制、用户登录(非前端后端分离场景)等,过滤非法登录

二、自定义过滤的两种方式

2.1 第一种方式

1.启动类里面增加 @ServletComponentScan,进行扫描
2.新建一个Filter类implements Filter,并实现对应的接口
3. @WebFilter 标记一个filter类,被spring进行扫描
                        urlPatterns拦截规则,支持正则
4.控制chain.doFilter的方法的调用,来实现是否通过放行还是不放行,
            如果放行FilterChain.dofilter(res,rep);
            如果不放行调转到指定页面web应用resp.sendRedirect("/index.html"); return

2.1.1 启动类增加注解@ServletComponentScan

package com.bjpowernode.springbootfilter01;

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

/**
 * SpringBoot整合filter   方式一
 */
@ServletComponentScan
@SpringBootApplication
public class SpringbootFilter01Application {

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

}

2.1.2 定义一个filter类

package com.bjpowernode.springbootfilter01.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

import java.util.logging.LogRecord;

/**
 *SpringBoot整合Filter 方式一
 *<filter>
 *	<filter-name>FirstFilter</filter-name>
 *	<filter-class>com.bjpowernode.filter.FirstFilter</filter-class>
 *</filter>
 *<filter-mapping>
 *	<filter-name>FirstFilter</filter-name>
 *	<url-pattern>/first</url-pattern>
 *</filter-mapping>
 */
@WebFilter(filterName = "FirstFilter",urlPatterns = "/first")
public class LoginFilter implements Filter {
    public boolean isLoggable(LogRecord record) {
        return false;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, IOException {
        System.out.println("进入Filter");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("离开Filter");
    }

    @Override
    public void destroy() {

    }



}

2.1.3. 测试

浏览器访问localhost:8080/first
在这里插入图片描述

在这里插入图片描述

2.2 第二种方式

2.2.1 自定义fitler类

package com.bjpowernode.springbootfilter02.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
 *
 *SpringBoot整合Filter 方式二
 *
 */
public class SecondFilter implements Filter {
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("进入SecondFilter");
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("离开SecondFilter");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

2.2.4 在启动类中进行配置

package com.bjpowernode.springbootfilter02;

import com.bjpowernode.springbootfilter02.filter.SecondFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

/**
 * SpringBoot整合Filter方式二
 */
@SpringBootApplication
public class SpringbootFilter02Application {

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

    /**
     * 注册Filter
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new SecondFilter());
        //filterRegistrationBean.addUrlPatterns(new String[]{"*.do","*.jsp"});
        filterRegistrationBean.addUrlPatterns("/second");
        return filterRegistrationBean;
    }
}


2.4.3 第二种方式的另一种写法

将启动类配置@Bean的部分,提取到专门的配置类中,并用 @Autowired注入SecondFilter对象,所以在传参数的时候就不用new SecondFilter对象了

package com.bjpowernode.springbootfilter02_1.config;

import com.bjpowernode.springbootfilter02_1.filter.SecondFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyWebMvcConfiger implements WebMvcConfigurer {

    @Autowired
    private SecondFilter secondFilter;

    /**
     * 注册Filter
     */
    @Bean
    public FilterRegistrationBean filterRegistrationBean(){
//        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new SecondFilter());
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(secondFilter);

        //filterRegistrationBean.addUrlPatterns(new String[]{"*.do","*.jsp"});
        filterRegistrationBean.addUrlPatterns("/second");
        return filterRegistrationBean;
    }
}

因为要有@Autowired注解注入SecondFilter对象,所以SecondFilter需要交给Spring容器管理,所以需要在SecondFilter加上一个@Component注解才能被spring容器扫描到
在这里插入图片描述

2.4.4. 测试

浏览器访问localhost:8080/second
在这里插入图片描述
在这里插入图片描述

2.3 过滤器的小案例

2.3.1 场景描述

自定义一个过滤器:对路径中含有api字样且userName为xm的请求则放过进行,否则其他情况进行拦截。

浏览器访问实例:http://localhost:8080/api/showUserName?userName=xm

2.3.2 Controller层

package com.bjpowernode.springbootfilter03logindemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@Controller
public class UserController {

    @RequestMapping("/api/showUserName")
    public String showName(String userName, Model model){
        System.out.println("进入controller层了!!!"+userName);
        model.addAttribute("userName",userName);
        return "index";//跳转到指定页面
    }
}

2.3.3 启动类 添加注解:@ServletComponentScan //添加过滤器使用

package com.bjpowernode.springbootfilter03logindemo;

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

/**
 * 场景描述
 * 自定义一个过滤器:对路径中含有api字样且userName为xm的请求则放过进行,否则其他情况进行拦截。
 */
@ServletComponentScan //添加过滤器使用
@SpringBootApplication
public class SpringbootFilter03LogindemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootFilter03LogindemoApplication.class, args);
        System.out.println("用户登录=====");
    }

}

2.3.4自定义过滤器类UserLoginFilter.java

package com.bjpowernode.springbootfilter03logindemo.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.LogRecord;

/**
 *SpringBoot整合Filter 方式一
 *<filter>
 *	<filter-name>loginFilter</filter-name>
 *	<filter-class>com.ljf.spring.boot.demo.spt.filter.filter.UserLoginFilter</filter-class>
 *</filter>
 *<filter-mapping>
 *	<filter-name>loginFilter</filter-name>
 *	<url-pattern>/api/*</url-pattern>
 *</filter-mapping>
 */
@WebFilter(urlPatterns = "/api/*",filterName = "loginFilter")
public class UserLoginFilter implements Filter {
package com.bjpowernode.springbootfilter03logindemo.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.logging.LogRecord;

/**
 *SpringBoot整合Filter 方式一
 *<filter>
 *	<filter-name>loginFilter</filter-name>
 *	<filter-class>com.ljf.spring.boot.demo.spt.filter.filter.UserLoginFilter</filter-class>
 *</filter>
 *<filter-mapping>
 *	<filter-name>loginFilter</filter-name>
 *	<url-pattern>/api/*</url-pattern>
 *</filter-mapping>
 */
@WebFilter(urlPatterns = "/api/*",filterName = "loginFilter")
public class UserLoginFilter implements Filter {

    /*
    *容器加载的时候调用
    */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("=================init loginFilter=============");
    }

    /*
    *请求被拦截的时候进行调用
    */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String userName = req.getParameter("userName");
        System.out.println("获取用户名:"+userName);
        if("xm".equals(userName)){
            System.out.println("用户名正确");
            System.out.println("===========");
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            System.out.println("用户名错误");
            System.out.println("跳转到登录页面");
            resp.sendRedirect("/login.html");//重定向不到templates目录下页面,必须走后端一下跳转到指定页面才行
//            req.getRequestDispatcher("/").forward(req,resp);
            return;
        }
    }

    /**
     * 容器被销毁的时候被调用
     */
    @Override
    public void destroy() {
        System.out.println("=========================destroy loginFilter=====================");
    }
}

如果满足浏览器的访问实例:http://localhost:8080/api/showUserName?userName=xm则跳转到templates下面的index.html页面

2.3.5 templates下的index页面

在这里插入图片描述

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
templates下的index页面
<td th:text="${userName}">/td>
</body>
</html>

如果不满足浏览器的访问实例:http://localhost:8080/api/showUserName?userName=xm,则重定向到static下的login.html

2.3.6被拦截后重定向的页面

static下的login.html
在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
登录页面-----------------------------static!!!
</body>
</html>

2.3.7 测试

项目启动

在这里插入图片描述

1.请求url含有api且userName=xm,放行通过
进入filter中
在这里插入图片描述

在这里插入图片描述

2.请求url含有api且userName=xsfdsf,拦截过滤,跳转到login.html页面
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

《Linux Shell脚本攻略》学习笔记-第五章

5.1 简介 借助HTTP协议所提供的功能以及命令行实用工具&#xff0c;我们可以用脚本满足大量的web自动化需求。 5.2 web页面下载 wget是一个用于文件下载的命令行工具&#xff0c;选项繁多且用法灵活。 下载单个文件或web页面 指定从多个URL处进行下载 我们可以通过选项-O指定输…

centos上用nginx搭建简单的点播服务器

查看centos系统信息&#xff1a;cat /etc/centos-release配置服务器DNSecho "nameserver 114.114.114.114" >> /etc/resolv.conf 安装网络工具yum install ntpdate wget net-tools -y同步服务器时间ntpdate ntp.aliyun.com安装编译工具及依赖库yum install -y …

【原生Button和antd的Button】

1. 原生Button 1. form 与按钮所关联的form元素。此属性的值必须是同一文档中form的id。如果未设置此属性&#xff0c;则 < Button>与其祖先< form>元素相关联 此属性允许将< Button>元素关联到文档中的任意位置< form>&#xff0c;而不仅仅是< …

Jenkins配置邮箱接收构建通知

Jenkins配置邮箱接收构建通知1、开启163邮箱的POP3/SMTP服务2、配置Jenkins Location3、配置Extended E-mail Notification4、配置邮件通知选项5、任务中配置6、任务构建测试7、怎么同时给多人发邮件1、开启163邮箱的POP3/SMTP服务 这里我们用163邮箱当作发件方&#xff0c;qq邮…

aloam学习笔记(四)

对于laserMapping.cpp源码的学习&#xff0c;这部分的主要功能是接受前端传来的数据&#xff0c;构建地图。 一、main函数部分 ros::init(argc, argv, "laserMapping");ros::NodeHandle nh;float lineRes 0;float planeRes 0;nh.param<float>("mapping…

前端食堂技术周刊第 67 期:2022 State of JS、ESLint 2022、pnpm 2022、大淘宝 Web 端技术概览

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;东北大饭包 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 2022 State of JS 结果出炉ESLint 2022 年终总结pnpm 2022 年终总结大淘…

Win10注册表损坏进不了系统怎么U盘重装系统?

Win10注册表损坏进不了系统怎么U盘重装系统&#xff1f;有用户电脑提示注册表损坏&#xff0c;自己进行了系统的重新启动之后&#xff0c;遇到了电脑无法正常启动进行系统桌面的情况。那么遇到这样的情况&#xff0c;我们怎么去进行U盘重装系统呢&#xff1f;一起来看看具体的操…

ZIP压缩文件如何加密?忘记密码怎么办?

ZIP是常用的压缩文件格式之一&#xff0c;除了方便传输、节省空间&#xff0c;还能通过设置密码来保护文件。 设置ZIP文件的密码保护需要用到压缩软件&#xff0c;下面先说说最常用的WinRAR是如何设置ZIP文件的密码。 方法一&#xff1a; 我们可以压缩文件的同时设置密码&am…

core-js常见于qiankun中的多份polyfill冲突问题

问题 开门见山&#xff0c;你可能会在 qiankun 等微前端体系中&#xff0c;有多个子应用时&#xff0c;发生这样的加载崩溃问题&#xff1a; Cannot redefine property: DEG_PER_RAD Cannot redefine property: RAD_PER_DEG 实际上 DEG_PER_RAD 和 RAD_PER_DEG 都是 Math 上的…

Android面经_111道安卓基础问题(四大组件Activity、Service篇)

111道Android面试基础题目&#xff0c;巩固基础作用。 Android基础问题——四大组件之Activity、Service1、Activity1.1、请介绍activity的生命周期1.1.1、生命周期回调之onCreate()1.1.2、生命周期回调之onStart()1.1.3、生命周期回调之onResume()1.1.4、生命周期回调之onPaus…

【java】java多线程及线程池面试题

目录前言线程是什么&#xff1f;多线程是什么&#xff1f;多线程的作用和好处以及缺点守护线程和用户线程并发和并行的区别一.线程的状态和常用方法1.线程各种状态转化图2.线程相关常用方法有① wait()② sleep(long timeout)③ join()④ yield()⑤ notify()和notifyAll()3.wai…

全流量分析为企业提升SAP用户体验

前言 某汽车总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量&#xff0c;重点针对SAP系统性能进行分析&#xff0c;以供安全取证、应用事务分析、网络质量监测以及深层网络分析。 本次分析报告包含&#xff1a;SAP系统性能分析。 分析对…

【北京理工大学-Python 数据分析-3.2Pandas数据特征分析】

对一组数据的理解 数据摘要&#xff1a;通过以下方法&#xff1a;有损地提取数据特征的过程。 基本统计&#xff08;含排序&#xff09;分布/累计统计数据特征相关性周期性等数据分析 Pandas库的数据排序 .sort_index(axis0,asccendingTrue)。.sort_index()方法在指定轴上根…

Tomcat 三种简单网站部署方式

Tomcat 服务部署 1、隐式部署 为什么可以隐式部署&#xff0c;是因为 Tomcat 配置了默认主机 webapps&#xff0c;在 Engine 下你也可以配置其他主机&#xff08;要保证你配置的主机在 ect/host 下有对应关系&#xff09;&#xff0c;但是 appBase 要确保唯一。保证每台主机下…

Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)

Effective C条款40&#xff1a;明智而审慎地使用多重继承&#xff08;Use multiple inheritance judiciously&#xff09;条款40&#xff1a;明智而审慎地使用多重继承1、多重继承的两个阵营2、多重继承中&#xff0c;接口调用的歧义性3、菱形继承与虚(virtual)继承3.1 菱形继承…

注意力FM模型AFM

1. 概述 在CTR预估任务中&#xff0c;对模型特征的探索是一个重要的分支方向&#xff0c;尤其是特征的交叉&#xff0c;从早起的线性模型Logistic Regression开始&#xff0c;研究者在其中加入了人工的交叉特征&#xff0c;对最终的预估效果起到了正向的效果&#xff0c;但是人…

华为MPLS跨域C1方案实验配置

目录 配置接域内IGP路由协议与LDP协议 配置IPv4的BGP邻居 配置PE之间的Vpnv4邻居 配置PE与CE设备对接命令 ASBR上手工为PE地址分配标签 MPLS隧道——跨域解决方案C1、C2讲解_静下心来敲木鱼的博客-CSDN博客_route-policy rr permit node 10 if-match mpls-labelhttps://bl…

IB地理课选课指南,SL还是HL适合呢?

IB地理科的标准级别&#xff08;Standard Level&#xff0c; SL&#xff09;课程跟高级级别&#xff08;Higher Level&#xff0c;HL&#xff09;课程的最大不同处在于&#xff0c;考卷的数量跟题目的数量是不同的。可是&#xff0c;两者之间的教学内容和科目指引&#xff08;S…

二十八、Kubernetes中job详解

1、概述 在kubernetes中&#xff0c;有很多类型的pod控制器&#xff0c;每种都有自己的适合的场景&#xff0c;常见的有下面这些&#xff1a; ReplicationController&#xff1a;比较原始的pod控制器&#xff0c;已经被废弃&#xff0c;由ReplicaSet替代 ReplicaSet&#xff…

CentOS 7 升级安装 Python 3.9 版本

由于 yum install python3 默认安装的 Python 版本较低&#xff0c;现如今有更高版本的 Python 需求&#xff0c;就想用编译安装的方法安装一个较高版本的 Python&#xff0c;顺道记录一下安装过程。 注意&#xff1a;不要卸载自带的 python2&#xff0c;由于 yum 指令需要 pyt…