SpringBoot中的过滤器与监听器

过滤器与监听器

1.过滤器

在很多web项目中,都会用到过滤器,例如参数过滤、防止SQL注入、防止页面攻击、参数矫正、Token验证、Session验证等

1.1 为什么需要过滤器

在Web开发中,往往有这样的需求:在所有接口中去除用户输入的非法字符,以防止业务异常,如果需要处理这个问题,会有很多方法

  • 在前端参数传入的时候进行校验,先过滤非法字符
  • 后端接收到前端没有过滤的数据,然后过滤非法字符
  • 利用过滤器处理项目中所有的非法字符

如果利用前两种方法,就需要在每个前端页面或者后端进行处理,会在项目中存在很多重复的代码;但是如果利用过滤器,那只需要在每个接口进行过滤处理,减少了冗余代码。

1.2 使用步骤

  1. 实现Filter抽象类
  2. 重写类方法
  3. 在Spring Boot入口中添加@ServletComponentScan,注册过滤器

编写过滤器代码

package com.example.demo;

import org.springframework.core.annotation.Order;

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

@Order(1)
@WebFilter(filterName = "Filterdemo",urlPatterns = "/*")
public class Filterdemo implements Filter {


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

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("该页面经过了过滤器");
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

然后在启动类中加入注解@ServletComponentScan,启动服务

因为在过滤器路由设置中为/*,所以不论访问任何页面都会经过过滤器,控制台都会有输出

image-20211107220159011

2.监听器

监听器是用于监听Web应用中某些对象或者信息的创建、销毁、增加、修改、删除等动作,然后作出相应的响应处理。当对象的状态发生变化时,服务器自动调用监听器的方法。

监听器常用于统计在线人数、系统加载时的信息初始化等等

servlet中的监听器分为以下三种类型:

  1. 监听ServletContext、Request、Session作用域的创建和销毁

    • ServletContextListener:监听ServletContext
    • HttpSessionListener:监听新的Session创建事件
    • ServletRequestListener:监听ServletRequest的初始化和销毁
  2. 监听ServletContext、Request、Session作用域中的属性变化(增加、修改、删除)

    对应的AttributeListener监听参数的变化

  3. 监听HttpSession中的对象状态的改变(被绑定、解除绑定、钝化、活化)

    • HttpSessionBindingListener:监听HttpSession,并绑定及解除绑定
    • HttpSessionActivationListener:监听钝化和活动的HttpSession状态的改变

来看看ServletContext监听器的例子

package com.example.demo;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

@WebListener
public class listenerdemo implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext 初始化");
        System.out.println(sce.getServletContext().getServerInfo());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext 销毁");
    }
}

image-20211107221944194

image-20211107222012656

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shelgi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值