SpringBoot(七)Filter的使用

这篇具有很好参考价值的文章主要介绍了SpringBoot(七)Filter的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    思考一个问题,服务端对于客户端的请求,真的应该照单全收吗?不是的。比如拿我们之前实现的用户注册功能来看,如果用户的昵称带了一些不友好的字母或汉字,你是给他过滤掉呢还是让他注册呢?毫无疑问,我们需要过滤掉一些不友好的请求。 

    如果你是新手,且没看过我之前的一系列SpringBoot文章,建议至少看一下这一篇:

SpringBoot(四)SpringBoot搭建简单服务端_springboot做成服务_heart荼毒的博客-CSDN博客​​​​​​​

    如果你想从头到尾系统地学习,欢迎关注我的专栏,持续更新:

https://blog.csdn.net/qq_21154101/category_12359403.html

目录

一、过滤器Filter

二、创建Filter

三、SpringBoot使用Filter

1、@WebFilter注解 + @ServletComponentScan注解

2、使用@Component注解

四、实践-敏感字过滤器


一、过滤器Filter

    Filter,过滤器,是在客户端和服务端之间用来过滤一些请求的中间件。它的作用通常包括以下几个方面:

1、Session校验

2、用户权限判断

3、敏感词过滤

4、设置编码等

    过滤器可以有0-多个,如下图所示:

SpringBoot(七)Filter的使用,SpringBoot,spring boot,后端,java

二、创建Filter

    Filter是servlet下的一个接口。创建filter的方法比较简单,实现Filter接口就可以了。通常,我们不需要去修改init和destroy的实现,只需要去重写doFiler的方法就可以:

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

public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

三、SpringBoot使用Filter

    SpringBoot支持使用Filter,那么如何使用呢?有多种方式,除了狗都不用的配置方式外,在这里介绍两种方式。两种方式各有优缺点,可以根据自己的实际需要去使用。

1、@WebFilter注解 + @ServletComponentScan注解

    第一种方式,是分别在Filter的实现类使用@WebFilter注解(表明该类是一个Filter)并且在Application类添加ServletComponentScan注解(告诉Application去什么路径扫描Filter)。如下所示:

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

@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("测试第一个过滤器");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = "com.zhaojun.server.filter")
public class AndroidServerApplication {

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

    运行一下项目,访问如下接口试试:

http://localhost:8080/register?name=hhh&phone=19999999999&password=123456

SpringBoot(七)Filter的使用,SpringBoot,spring boot,后端,java

 可以看到,输出了如下日志,说明filter是生效的:

SpringBoot(七)Filter的使用,SpringBoot,spring boot,后端,java

@WebFilter注解 + @ServletComponentScan注解的方式使用Filter,可以指定要拦截的url , 但是不能指定过滤器执行顺序。

2、使用@Component注解

    前面我们也说到了,filter可以有0-多个。在实际的项目中,我们可能有多个过滤器并且多个过滤器可能存在必要的先后顺序。那么,使用上面说到的第一种方式就无法满足我们的诉求。这种场景下,可以使用第二种方式@Component注解。如下:

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

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

@Component
@Order(1)
public class Filter1 implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("第1个过滤器");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

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

@Component
@Order(2)
public class Filter2 implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("第2个过滤器");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

    build一下,还是访问这个接口:

​​​​​​​http://localhost:8080/register?name=hhh&phone=19999999999&password=123456

SpringBoot(七)Filter的使用,SpringBoot,spring boot,后端,java

    可以看到,Filter的执行顺序:

SpringBoot(七)Filter的使用,SpringBoot,spring boot,后端,java

使用@Component注解的方式使用Filter,可以保证执行顺序, 但是过滤器不能指定拦截的url , 只能默认拦截全部。

四、实践-敏感字过滤器

    上面介绍了两种使用过滤器的方法,接下来,我们基于之前写的注册接口,去实现一个敏感字过滤器。当注册接口的请求含有敏感字时拦截该请求,不包含敏感字时放行。在这里,我使用的是第一种方式:

package com.zhaojun.server.filter;

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

@WebFilter(urlPatterns = "/*")
public class MyFilter implements Filter {

    String[] sensitiveWords = {"sb", "2b", "cnm"};

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);
        String uri = request.getRequestURI();
        // 暂时只针对register接口过滤
        if (uri.contains("/register")) {
            String queryString = request.getQueryString();
            System.out.println(queryString);
            // 敏感字过滤校验通过,放行
            if (checkSensitiveWords(queryString)) {
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                // 校验不通过,重定向到fail接口
                wrapper.sendRedirect("/fail");
                System.out.println("敏感词过滤拦截");
            }
        } else {
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }

    /**
     * 校验请求参数敏感字是否通过
     *
     * @param queryString 请求参数
     * @return true/false
     */
    private boolean checkSensitiveWords(String queryString) {
        for (int i = 0; i < sensitiveWords.length; i++) {
            if (queryString.contains(sensitiveWords[i])) {
                return false;
            }
        }
        return true;
    }
}

    如果敏感词校验没通过,重定向到的fail接口实现如下:

package com.zhaojun.server.controller;

import com.zhaojun.server.result.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RegisterFailController {
    @RequestMapping("fail")
    public Result registerFail() {
        Result result = new Result();
        result.code = 0;
        result.status = "fail";
        result.msg = "昵称含有敏感字";
        return result;
    }
}

    请求接口试试,注意,这次使用一个包含敏感字的名字:​​​​​​​http://localhost:8080/register?name=2b&phone=19999999999&password=123456​​​​​​​

    可以看到,重定向到fail接口,并且输出了昵称含有敏感字:

SpringBoot(七)Filter的使用,SpringBoot,spring boot,后端,java

    本篇介绍了Filter的作用,在SpringBoot中使用Filter的两种方式,并且介绍了两种方式的优缺点(顺序和指定url)。在最后,基于之前的注册接口,实现了一个简单的敏感字过滤器。如果你觉得这篇文章对你有帮助,欢迎留言或点赞。文章来源地址https://www.toymoban.com/news/detail-559663.html

到了这里,关于SpringBoot(七)Filter的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “从零开始学习Spring Boot:快速搭建Java后端开发环境“

    标题:从零开始学习Spring Boot:快速搭建Java后端开发环境 摘要:本文将介绍如何从零开始学习Spring Boot,并详细讲解如何快速搭建Java后端开发环境。通过本文的指导,您将能够快速搭建一个基于Spring Boot的Java后端开发环境并开始编写代码。 正文: 一、准备工作 在开始之前,

    2024年02月15日
    浏览(55)
  • 【Spring Boot系列】-Spring Boot过滤器Filter

    **Filter(过滤器) 可以理解为经过一层次的过滤处理才达到使用的要求,而其实 Filter(过滤器) 就是服务器与客户端请求与响应的中间层组件,在实际项目开发中 Filter(过滤器)**主要用于对浏览器的请求进行过滤处理,将过滤后的请求再转给下一个资源。 **Filter(过滤器

    2024年02月13日
    浏览(48)
  • 【Spring】Springboot过滤器Filter和拦截器Inteceptor详解及使用场景

    Springboot过滤器Filter和拦截器Inteceptor详解及使用场景

    2024年02月13日
    浏览(42)
  • 后端使用Spring Boot生成Excel文件,前端使用微信小程序上送数据并下载Excel文件

    后端:Spring Boot生成Excel文件添加依赖 在 pom.xml 中添加Apache POI的依赖: 创建一个用于生成Excel文件的方法         4.创建一个用于处理Excel文件的Controller 前端:微信小程序上送数据并下载Excel文件 在 app.json 中添加一个用于下载Excel文件的页面: 在 pages/download 目录下创建

    2024年04月11日
    浏览(88)
  • 2023 最新版IntelliJ IDEA 2023.1创建Java Web前(vue3)后端(spring-boot3)分离 项目详细步骤(图文详解)

    2023 最新版IntelliJ IDEA 2023.1创建Java Web 项目详细步骤(图文详解) 本篇使用当前Java Web开发主流的spring-boot3框架来创建一个Java前后端分离的项目,前端使用的也是目前前端主流的vue3进行一个简单的项目搭建,让你距离Java全栈开发更近一步 🏴‍☠️。 使用版本: “17.0.1”

    2024年02月12日
    浏览(85)
  • 【Spring Boot】SpringBoot和数据库交互: 使用Spring Data JPA

    在现代应用程序的开发中,数据是核心部分。为了能够持久化、检索、更新和删除数据,应用程序需要与数据库进行交互。 1.1 为什么需要数据库交互 数据持久化 :当你关闭应用程序或者服务器时,你仍希望数据能够保存。数据库提供了一个持久的存储方案,使得数据在关闭

    2024年02月12日
    浏览(50)
  • Spring Boot 整合 Shiro(后端)

    1 Shiro 什么是 Shiro 官网: http://shiro.apache.org/ 是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、 授权、会话管理、加密等操作。 Shiro 就是用来解决安全管理的系统化框架。 2 Shiro 核心组件 用

    2024年02月09日
    浏览(49)
  • Android前端+Spring Boot后端 登录功能实现

    创建项目后,自己添加包,框架如下   userController里的一些内容,只供参考,代码不全,无法实现 数据库是直接在社区版IDEA里连接Mysql,在控制台端创建的数据库和user表,用于数据交互。 Activity包里是Activity Java类,主要响应layout包里activity_login.xml等页面布局内的按钮响应 a

    2024年02月12日
    浏览(66)
  • 阿里通义千问API(Java)使用教程,基于Springboot后端

    1.1 登录阿里云官网并搜索模型服务灵积,开通key 1.2 点击上图中的控制台并进入 1.3 创建key 2.1 导入以下俩个坐标 2.2 编写Controller层  这里controller层并未将前端的请求数据传入给api中的参数,有需求的可以自己加一下,这里就使用浏览器测试一下看是否返回数据即可  2.3 Ser

    2024年04月09日
    浏览(110)
  • Spring Boot进阶(55):SpringBoot之集成MongoDB及实战使用 | 超级详细,建议收藏

            随着大数据时代的到来,数据存储和处理变得越来越重要。而MongoDB作为一种非关系型数据库,具有高效的数据存储和处理能力,被越来越多地应用于各种领域。尤其在Web应用开发中,SpringBoot框架已经成为了主流选择之一。在这篇文章中,我们将探讨如何将MongoD

    2024年02月17日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包