解决跨域问题,过滤器Filter,Servlet容器最重要的技术之一(基于SpringBoot开发过滤器)

注:本文中Tomcat,代表所有的Serlvet容器,由于Tomcat非常流行,所以用这个读者更加熟悉。

一、过滤器是什么,有什么用

你完成了项目编写,把它发布到网络上运行,此时,外部主机可以访问它,这时会出现一些问题。
【注:记你的项目为WP】
第一,主机A是个安全专家,测试自己写的脚本,在一分钟内,向WP发送十万次请求,这会使正常用户卡崩溃甚至无法使用。
第二,用户B访问你的项目,发现在不登录的情况下,就能购买你商店中的商品。这会使你遭受一定损失。
你必须为自己设置安全防护。
早期,对于第二个情况,最朴素的方法,是用户每次操作时,都必须输入账号密码,这样,能保证系统安全。
然而,这不仅使得用户体验很差,还会使代码量变多变复杂,这种业务逻辑的代码,会影响正常开发。
随着开发思想的迭代,开发者把安全行为抽离业务逻辑,形成一道屏障—“防火墙”。
当然,这是一种类比,在Servlet容器中,一切外部主机访问项目,都要经过“过滤器
这就是我们今天的主角。
身份验证、权限控制,经典的工具jwt,就需要在过滤器中使用。【当然,在代码逻辑中也不是不行】
过滤器的作用对象,是外部主机,所以它默认不影响正常代码逻辑【也可以让它影响】
由于过滤器是项目门户,需要在项目启动前就布置好,恰好和Servlet容器运行的时间段类似,所以Servlet容器内置了过滤器功能。
比如常用的Tomcat服务器,就默认使用WebMVCConfigurer类的过滤配置。

二、Filter接口和WebMVCConfigurer接口的介绍

Tomcat的所有过滤行为,都基于Filter接口。
Filter接口在实际上,定义了一个过滤器应该有的所有行为。
而我们常用于解决跨域问题的WebMVCConfigurer过滤配置,属于另一个过滤器分支。
虽然它与Filter没有父子关系,但我猜测,在Filter的子实现类里,一定组合了WebMVCConfigurer的实现类。
否则,我们不应该能够使用WebMVCConfigurer解决跨域问题。
WebMVCConfigurer中,定义了Web开发常用的跨域、页面跳转等过滤。
Filter定义了最重要的3个方法,

  1. doFilter:最重要的方法,真正的过滤逻辑
  2. init:初始化,过滤前的准备
  3. doDestroy:销毁过滤器后,会自动调用

三、过滤器的部署

开发前后端项目,我们常常会遇到跨域问题,今天,我们从它入手,详解它的原理,并解决它。

第一,浏览器跨域策略

  1. 跨域问题的原因:为保证安全,浏览器不允许不同应用层协议、不同IP地址、不同端口之间的应用程序直接通信。
  2. 举例:
    1. http://IP地址:端口号/资源 ftp:(或者https) 之间,协议不同,不允许跨域访问
    2. 1.1.23.4 和 2.1.4.1 之间,IP地址不同,不允许
    3. 后端项目127.0.0.1:8080 和前端项目127.0.0.1:5143之间,端口号不同,不允许

表面上,跨域问题由浏览器引起,使用postman、jmeter访问时,似乎不会有问题。
然而,浏览器对跨域问题只有标记作用(即标记是否跨域了),真正的跨域解决方案,内置在Tomcat容器中

第二,跨域的成因

既然跨域方案在Servlet容器中,又因为使用SSM框架开发项目时,使用WebMVCConfigurer实现类作为默认过滤器,所以,成因就是该实现类默认不允许跨域。

第三,跨域解决

我选用的是使用@WebFilter注解表示一个过滤器,使这个过滤器拦截所有的请求,架空WebMVCConfigurer实现类的权力,然后在新过滤器中解决问题。
注:此方法要做2件事

  1. 使用@WebFilter注解过滤器类
  2. 该过滤器类实现Filter接口

完成后,就可以重写3个方法
代码为:

// 拦截所有请求
@WebFilter(urlPatterns = "/*")
public class FilterPermission implements Filter {// 初始化方法,一般不用@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 放行函数filterChain.doFilter(servletRequest,servletResponse);}// 销毁函数@Overridepublic void destroy() {Filter.super.destroy();}

这样,就能粗略地解决跨域问题,当然,也带来了一些安全问题,在此不赘述。

四、结语

我是蚊子码农,如有补充或者疑问,欢迎在评论区留言。个人的知识体系可能没有那么完善,希望各位多多指正,谢谢大家。

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

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

相关文章

go sync包(二) 互斥锁(二)

互斥锁 Mutex mutex 的 加解锁很简单: var mutex sync.Mutexmutex.Lock()defer mutex.Unlock()// 加锁期间的代码逻辑加锁 // Lock locks m. // If the lock is already in use, the calling goroutine // blocks until the mutex is available. func (m *Mutex) …

机房布线新方案:数字化运维如何助力企业高效腾飞

随着信息量的激增,传统的机房布线管理方式已经难以满足现代化企业的需求,存在着“视觉混乱、记录不准”等严重问题,这不仅影响了机房运维的效率,更对企业的数据安全构成了潜在威胁。然而,随着耐威迪数字化运维管理方案…

工业AIoT竞赛

模块一:工业物联环境构建 # 查看节点状态 kubectl get nodes # 查看所有 pods 状态 kubectl get pods --all-namespaces cd /data/script/ ls | grep install_openyurt_manager # ./install_openyurt_manager_v5.sh是搜索到的脚本文件 ./install_openyurt_manager_v…

校园疫情防控健康打卡系统

摘 要 自疫情出现以来,全世界人民的生命安全和健康都面临着严重威胁。高校是我国培养人才的重要基地,其安全和稳定影响着社会的发展和进步。因此,各高校高度重视疫情防控工作,并在校园疫情防控中引入了健康打卡系统。本论文主要研…

tsf consul单独使用,可以在tsf部署不

Consul 是一个开源的工具,用于服务发现和配置。它提供了服务注册与发现、健康检查、键值存储、多数据中心支持等功能。Consul 可以单独使用,也可以与其他系统集成,如与微服务平台 TSF(Tencent Service Framework)结合使…

RISC_CPU模块的调试

代码: cpu.v include "clk_gen.v" include "accum.v" include "adr.v" include "alu.v" include "machine.v" include "counter.v" include "machinectl.v" include "register.v&quo…

小兔鲜02

elementplus自动按需引入 elementplus主题色定制 安装sass npm install sass -D要替换的主题色内容: /* 只需要重写你需要的即可 */ forward element-plus/theme-chalk/src/common/var.scss with ($colors: (primary: (// 主色base: #27ba9b,),success: (// 成功…

【前端项目笔记】4 权限管理

权限管理 效果展示: (1)权限列表 (2)角色列表 其中的分配权限功能 权限列表功能开发 新功能模块,需要创建新分支 git branch 查看所有分支(*表示当前分支) git checkout -b ri…

Python字典常用操作与进阶玩法

在Python中,字典是一种常用的数据结构,是实现各类算法的基础。 1.创建字典 有多种方法可以创建字典,以下几种方法创建的字典均等于 {"one": 1, "two": 2, "three": 3} a dict(one1, two2, three3) b {one:…

审稿人:拜托,请把模型时间序列去趋势!!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 时间序列分析是数据科学中一个重要的领域。通过对时间序列数据的分析,我们可以从数据中发现规律、预测未来趋势以及做出决策…

web中间件漏洞-Resin漏洞-密码爆破、上传war

web中间件漏洞-Resin漏洞-密码爆破、上传webshell 使用爆破结果resin/resin进入后台,选择deploy。想部署webshell,得使用SSL方式请求,访问https://192.168.1.2:8443/resin-admin/index.php?qdeploy&s0(注:如果使用最新的火狐浏览器或者谷…

vb.net帮助文档

vb.net帮助文档:https://download.csdn.net/download/wgxds/89462555

[论文笔记]Are Large Language Models All You Need for Task-Oriented Dialogue?

引言 今天带来论文Are Large Language Models All You Need for Task-Oriented Dialogue?的笔记。 主要评估了LLM在完成多轮对话任务以及同外部数据库进行交互的能力。在明确的信念状态跟踪方面,LLMs的表现不及专门的任务特定模型。然而,如果为它们提…

C语言中字符串处理函数

目录 前言 1. strlen 测字符串长度函数 2.字符串拷贝函数 2.1strcpy 2.2 strncpy 3.strcat字符串追加函数 4. strcmp/strncmp 比较函数 5.字符查找函数 5.1 strchr 5.2 strrchr 6.atoi/atol/atof字符串转换数值 总结 前言 从0开始记录我的学习历程,我会尽…

一小时搞定JavaScript(1)——JS基础

前言,本篇文章是依据bilibili博主(波波酱老师)的学习笔记,波波酱老师讲的很好,很适合速成!!! 本篇文章会与java进行对比学习,因为JS中很多语法和java是相同的,所以大家最好熟悉Java语言后再来进行学习,效果更佳,见效更快. 文章目录 1.基本语法1.1 JS语言的特点1.2 创建一个JS文…

【Qt快速入门(四)】- QLabel文本框的使用

目录 Qt快速入门(四)- QLabel文本框的使用QLabel文本框的使用QLabel的基本用法1. 创建和设置文本2. 动态设置文本 设置文本样式1.设置字体和颜色2.文本对齐方式3.富文本显示 显示图片QLabel的交互功能可点击标签 QLabel的高级特性1.缩放图片以适应标签大…

开发一个软件自动运行工具不可缺少的源代码分享!

在软件开发领域,自动运行工具扮演着至关重要的角色,它们能够简化软件部署、提升运行效率,并在很大程度上降低人为操作失误的可能性。 而一个高效的自动运行工具的背后,往往是经过精心设计与实现的源代码在默默支撑,本…

如何解决资源管理器被结束任务后的问题,怎么重启或新建资源管理器任务?

服务器上运行的东西太多,修改个文件夹的名字导致卡死。结束任务后导致系统页面空白。(关闭了windows资源管理器) 按CtrlShiftDelete没有反应。 按CtrlShiftEsc没有反应。 按CtrlShiftEnd没有反应。 按CtrlALTEnd有反应。 (win2012) 输入…

让NSdata对象转变成UIImage对象再裁剪图片的方法

下面的代码是从自己项目代码里抠出来的,作为自己的笔记,raw文件尚未测试,有问题可以留言。 - (void)p_cropImg {// 1. 获取待裁剪图片. 暂时让方向固定为upUIImage *image [UIImage imageWithData:self.photoData];image kCGImageProperty…

贝锐蒲公英异地组网方案:实现制药设备远程监控、远程运维

公司业务涉及放射性药品的生产与销售,在全国各地拥有20多个分公司。由于药品的特殊性,在日常生产过程中,需要符合药品监管规范要求,对各个分部的气相、液相设备及打印机等进行监管,了解其运行数据及工作情况。 为满足这…