SpringBoot——整合Servlet的三大组件:过滤器(Filter)

目录

过滤器

一、用过滤器检查用户是否登录 

LoginFilter自定义过滤器

FilterConfig配置类

FilterController控制器

SpringbootFilterApplication启动类 

二、用过滤器统计资源访问量

LoginFilter

FilterController


在开发SpringBoot项目时,开发人员经常需要对HTTP请求进行拦截和处理,以实现诸如身份验证、授权、日志记录等功能。为了实现这些功能,Spring Boot提供了过滤器和拦截器这两个工具。此外,开发人员还需要使用SpringBoot中的监听器监听SpringBoot项目中的特定事件,以实现统计网站访问量、记录用户访问路径、系统启动时加载初始化信息等功能。

过滤器

  • 过滤器不仅可以对用户通过URL地址发送的请求进行过滤处理,例如,过滤一些错误的请求或者请求中的敏感词等,而且可以对服务器返回的数据进行过滤处理,例如,压缩响应信息
  • 过滤器在Web开发中的一些主要应用:
    • 对用户请求进行统一认证
    • 对用户的访问请求进行记录和审核 
    • 对用户发送的数据进行过滤和替换
    • 转换图像格式
    • 对响应内容进行压缩,减少传输量
    • 对请求和响应进行加密和解密处理
    • 触发资源访问事件
  • 实现过滤器主要是实现了Filter接口,Filter接口有三大方法:
    • init():初始化方法
    • doFilter():过滤方法
    • destroy():销毁方法
  • 过滤器与拦截器的主要区别在于触发的时机不同

一、用过滤器检查用户是否登录 

  • 大多数网站都会要求用户登录之后再浏览网站内容,如果用户在未登录状态下直接访问网站资源,网站就会提示用户先登录 
  • SpringBoot专门提供了用于配置过滤器的FilterRegistrationBean

新建一个SpringBoot项目

项目结构:

LoginFilter自定义过滤器

package com.study.springboot_filter.filter;

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

public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) request;
        Object user = req.getSession().getAttribute("user");
        if(user==null){//表示没有任何登录记录,强制把请求转发至登录页面
            req.getRequestDispatcher("/login").forward(request,response);
        }else{
            chain.doFilter(request, response);
        }
    }
}

FilterConfig配置类

package com.study.springboot_filter.config;

import com.study.springboot_filter.filter.LoginFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean getFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean<>();
        bean.setFilter(new LoginFilter());
        bean.addUrlPatterns("/main/*");//过滤"/main"下的所有子路径
        bean.setName("loginfilter");
        return bean;
    }
}

FilterController控制器

package com.study.springboot_filter.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FilterController {

    /**
     * 登录后访问的页面
     */
    @RequestMapping("/main/index")
    public String index(){
        return "欢迎访问XXX网站";
    }

    /**
     * 登录页面
     */
    @RequestMapping("/login")
    public String login(){
        return "请先登录!";
    }
}

SpringbootFilterApplication启动类 

package com.study.springboot_filter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootFilterApplication {

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

}

 启动项目,访问网址:http://localhost:8080/main/index

session中没有用户登录的记录,所以页面强制跳转到了登录页面

二、用过滤器统计资源访问量

  • 使用过滤器可以统计某个URL地址的访问次数
  • 使用@WebFilter注解可以快速配置过滤器
  • 代码基本同上,核心部分如下

LoginFilter

package com.study.springboot_filter.filter;

import org.springframework.stereotype.Component;

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

/**
 * 使用@WebFilter注解可以快速配置过滤器,必须同时与@Component一起使用
 * urlPatterns为过滤器所过滤的地址,在此模拟了一个在线的视频文件
 */
@Component
@WebFilter(urlPatterns = "/vedio/710.mp4")
public class LoginFilter implements Filter {//Filter接口有如下三大方法

    //过滤器初始化时会调用该方法,可不重写
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ServletContext context = filterConfig.getServletContext();//获取上下文对象
        context.setAttribute("count",0);//计数器初始值为0
    }

    //过滤器的核心方法,在该方法中实现过滤业务,必须被重写
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req=(HttpServletRequest) request;
        ServletContext context = req.getServletContext();//获取上下文对象
        Integer count= (Integer) context.getAttribute("count");//获取计数器的值
        context.setAttribute("count",++count);//让计数器自增
        chain.doFilter(request, response);//过滤链对象,可将请求交给下一个过滤器处理
    }


    //过滤器销毁时会调用的方法,可不重写
    @Override
    public void destroy() {
        
    }

}

FilterController

package com.study.springboot_filter.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

@RestController
public class FilterController {

    @RequestMapping("/vedio/710.mp4")
    public String index(HttpServletRequest request){
        ServletContext context = request.getServletContext();
        Integer count= (Integer) context.getAttribute("count");
        return "当前访问量: "+count;//打印该地址被访问的次数
    }
}

启动项目,访问网址:http:localhost:8080/vedio/710.mp4

每次刷新该页面,访问量都会递增。重启浏览器,仍然可以看到累计的访问量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Obfuscar 混淆WPF(Net6)程序

Obfuscar 是.Net 程序集的基本混淆器&#xff0c;它使用大量的重载将.Net程序集中的元数据&#xff08;方法&#xff0c;属性、事件、字段、类型和命名空间的名称&#xff09;重命名为最小集。详细使用方式参见&#xff1a;Obfuscar 在NetFramework框架进行的WPF程序的混淆比较…

乡村振兴的乡村旅游品质提升:提升乡村旅游服务质量,打造乡村旅游品牌,增强乡村旅游吸引力,打造具有旅游特色的美丽乡村

目录 一、引言 二、提升乡村旅游服务质量 1、完善基础设施建设 2、提升服务人员素质 3、规范服务流程 三、打造乡村旅游品牌 1、挖掘乡村文化特色 2、打造特色旅游产品 3、加强品牌宣传和推广 四、增强乡村旅游吸引力 1、创新旅游体验方式 2、打造旅游精品线路 3、…

【NOI】C++程序结构入门之循环结构二-for循环

文章目录 前言一、for循环1.导入2.语法3.使用场景4.条件控制5.小结 二、例题讲解问题&#xff1a;1264 - 4位反序数问题&#xff1a;1085 - 寻找雷劈数问题&#xff1a;1057 - 能被5整除且至少有一位数字是5的所有整数的个数问题&#xff1a;1392 - 回文偶数&#xff1f;问题&a…

Windows下设置pip代理(proxy)

使用场景 正常网络情况下我们安装如果比较多的python包时&#xff0c;会选择使用这种 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-hostpypi.tuna.tsinghua.edu.cn 国内的镜像来加快下载速度。 但是&#xff0c;当这台被限制上…

Python 图书馆管理系统(MySQL数据库) 有GUI界面 【含Python源码 MX_032期】

使用python3&#xff0c;PyQt5&#xff0c;MySQL数据库搭建 主要功能&#xff1a; 用户注册、登录、修改密码、用户管理存储图书信息、采购增加和淘汰删除功能、租借功能实现图书采购、淘汰、租借功能。实现查询图书信息、采购和淘汰、库存、和租借情况实现统计图书的采购、库…

【FPGA】Verilog:全加器与半加器 | Full Adder | Half Adder

0x00 全加器(Full Adder) 值的加法运算逻辑电路,全加器不仅可以包括输入值,还可以将进位值纳入加法运算,是实现各种运算电路的基本运算电路。输出由 sum (S) 和 carry (C) 组成,加法运算中产生的进位称为 carry out ,从前一位传递过来并需纳入当前位加法运算的进位称为…

ElasticSearch学习笔记之一:介绍及EFK部署

1. 系统概述 The Elastic Stack&#xff0c;包括Elasticsearch、Kibana、Beats和Logstash&#xff08;也成为ELK Stack&#xff09; Elasticsearch&#xff1a;简称ES&#xff0c;是一个开源的高扩展的分布式全文搜索引擎&#xff0c;是整个Elastic Stack技术栈的核心。它可以…

【C++修行之道】类和对象(三)拷贝构造函数

目录 一、 概念 二、特征 正确的拷贝构造函数写法&#xff1a; 拷贝函数的另一种写法 三、若未显式定义&#xff0c;编译器会生成默认的拷贝构造函数。 四、编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了&#xff0c;还需要自己显式实现吗&#xff1f; 深拷…

项目资源管理

目录 1.概述 2.六个过程 2.1. 规划资源管理 2.2. 估算活动资源 2.3. 获取资源 2.4. 建设团队 2.5. 管理团队 2.6. 控制资源 3.应用场景 3.1.十个应用场景 3.2.软件开发项目 3.2.1. 资源规划 3.2.2. 资源分配 3.2.3. 资源获取 3.2.4. 资源优化 3.2.5. 资源监控与…

YOLOv10(4):损失(Loss)计算及其检测模型代码部分阅读

YOLOv10&#xff08;1&#xff09;&#xff1a;初探&#xff0c;训练自己的数据_yolov10 训练-CSDN博客 YOLOv10&#xff08;2&#xff09;&#xff1a;网络结构及其检测模型代码部分阅读-CSDN博客 目录 1. 写在前面 2. 双标签分配 3. 计算Loss的预备条件 &#xff08;1&a…

OpenCV-最小外接圆cv::minEnclosingCircle

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 函数原型 void minEnclosingCircle(InputArray points, Point2f& center, float& radius); 参数说明 InputArray类型的…

Codeforces Round 950 (Div. 3) 个人题解 (A~F1)

Codeforces Round 950 (Div. 3)个人题解(A~F1) 题解火车头 #define _CRT_SECURE_NO_WARNINGS 1#include <iostream> #include <vector> #include <algorithm> #include <set> #include <unordered_map> #include <cstring> #include <…

聚观早报 | 东风奕派eπ008将上市;苹果Vision Pro发布会

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月3日消息 东风奕派eπ008将上市 苹果Vision Pro发布会 特斯拉Model 3高性能版开售 小米14推送全新澎湃OS系统 …

ubuntu中彻底删除mysql (配置文件删除可选)

ubuntu中彻底删除mysql (配置文件删除可选) 对于此类即搜即用的分享文章&#xff0c;也不过多赘述&#xff0c;直接依次按照下面的操作执行即可&#xff1a; 一、删除 mysql 数据文件 sudo rm /var/lib/mysql/ -R二、删除 mysql 配置文件 sudo rm /etc/mysql/ -R三、查看 m…

基于 Spring Boot 博客系统开发(十三)

基于 Spring Boot 博客系统开发&#xff08;十三&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;十二&#xff09;&…

号称超级增程电动,领克07EM-P带来技术变革?

近年来&#xff0c;自主品牌在新能源汽车领域百花齐放&#xff0c;尤其是在混合动力市场上&#xff0c;比亚迪的DM-i技术引领了风潮&#xff0c;秦L的一经亮相&#xff0c;整个车圈都沸腾了&#xff0c;“超级混动”的概念深入人心。 各大自主品牌都有了自己的混动平台和技术。…

前端加载,渲染十万条数据(性能优化)

1.场景 项目中某个弹窗展示设备信息卡片,返回的设备信息很多,页面样式有很花哨,导致渲染极其缓慢 f12,查看性能,这里可以看到页面加载在哪一步分耗时最长,针对性进行优化(图为举例) 2.解决思路 采用虚拟列表的方式,滚动时,dom元素数量不变,只改变展示的数据 结构描述: 父盒…

基于飞腾 D2000 8 核+ 32G DDR+板载 6 千兆电口+ 4 千兆光口高性能网络安全主板

第一章、产品介绍 1.1 产品概述 XM-D2000GW是一款基于飞腾 D2000 8 核X100 桥片高性能网络安全主板&#xff0c;D2000 为飞腾首款支持 8 核桌面平 台处理器&#xff0c;支持双通道 DDR4-2666 内存&#xff0c;芯片内置国密 SM2/SM3/SM4/SM9 加速引擎&#xff0c;支持单精度、双…

华为ACL实验

实验拓扑&#xff1a; 实验目的&#xff1a;使用标准ACL控制某些数据流量&#xff0c;本例中控制PC1访问PC2且不让PC1访问到服务器。 实验思路&#xff1a;依据拓扑的要求&#xff0c;配置完终端设备后需要在交换机上划分两个vlan&#xff0c;分别代表两个企业的部门&#xff…

网络协议二

一、套接字Socket 基于 TCP UDP 协议的 Socket 编程&#xff0c;在讲 TCP 和 UDP 协议的时候&#xff0c;我们分客户端和服务端&#xff0c;在写程序的时候&#xff0c;我们也同样这样分。 在网络层&#xff0c;Socket 函数需要指定到底是 IPv4 还是 IPv6&#xff0c;分别对应设…