当前位置: 首页 > news >正文

Springboot实现Web组件注册

一、前言
在实际开发中,有时候我们可能使用springboot注册web组件,实现某些功能,比如我们需要生成一些api来提供对外的服务,而对应的路径其实是不固定的,那么这种情况下,其实是可以通过这种方式来注册web组件的。

二、如何实现?
1.使用SpringBoot注解加继承HttpServet类实现注册Servlet组件。

@WebServlet("/api")
public class APIServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {log.debug("servlet execute");String servletPath = request.getRequestURI();servletPath = servletPath.substring(apiContext.length() + 2);PrintWriter out = null;try {out = response.getWriter();ResponseDto responseDto = process(servletPath, request, response);out.append(JSON.toJSONString(responseDto));} catch (Exception e) {response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);out.append(JSON.toJSONString(ResponseDto.fail(e.toString())));log.error(e.toString(), e);} finally {if (out != null)out.close();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {doGet(req, resp);}public ResponseDto process(String path, HttpServletRequest request, HttpServletResponse response) {System.out.println("请求处理");ResponseDto dto = new ResponseDto();return dto;}
}

2.通过继承HttpServet类加配置类来进行注册。

public class APIServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {log.debug("servlet execute");String servletPath = request.getRequestURI();servletPath = servletPath.substring(apiContext.length() + 2);PrintWriter out = null;try {out = response.getWriter();ResponseDto responseDto = process(servletPath, request, response);out.append(JSON.toJSONString(responseDto));} catch (Exception e) {response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);out.append(JSON.toJSONString(ResponseDto.fail(e.toString())));log.error(e.toString(), e);} finally {if (out != null)out.close();}}
}

新建一个配置类,将该Servlet加载到Spring容器中,配置类代码如下:

@Slf4j
@Configuration
public class ServletConfig {@Value("${dbapi.api.context}")String apiContext;@Autowiredprivate APIServlet apiServlet;@Beanpublic ServletRegistrationBean getServletRegistrationBean() {String format = String.format("/%s/*", apiContext);ServletRegistrationBean bean = new ServletRegistrationBean(apiServlet);bean.addUrlMappings(format);log.info("regist APIServlet servelet for {} urlMappings",format);return bean;}
}

两种注册方式都是可用的。

3.注册Filter组件实现过滤。

@Slf4j
@Component
@WebFilter("/api")
public class ApiIPFilter implements Filter {@Autowiredprivate IPService ipService;@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException {log.debug("IP filter execute");HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String originIp = IPUtil.getOriginIp(request);String method = request.getMethod();PrintWriter out = null;try {//js跨域的预检请求,不经过处理逻辑。开发模式下,前端启动,访问8521的页面进行请求测试会跨域if (method.equals("OPTIONS")) {response.setStatus(HttpServletResponse.SC_OK);return;}boolean checkIP = ipService.checkIP(originIp);if (!checkIP) {out = response.getWriter();response.setStatus(HttpServletResponse.SC_FORBIDDEN);out.append(JSON.toJSONString(ResponseDto.fail("Illegal ip (" + originIp + "), access forbidden")));} else {filterChain.doFilter(servletRequest, servletResponse);}} catch (Exception e) {response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);out.append(JSON.toJSONString(ResponseDto.fail(e.toString())));log.error(e.toString());} finally {if (out != null) {out.close();}}}

这里会对某些IP进行过滤。

最后启动类中的@ServletComponentScan注解扫描web组件。

@SpringBootApplication
//SpringBoot启动时扫描注册注解标注的Web组件
@ServletComponentScan
public class SpringbootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootDemoApplication.class, args);}
}

相关文章:

Springboot实现Web组件注册

一、前言 在实际开发中,有时候我们可能使用springboot注册web组件,实现某些功能,比如我们需要生成一些api来提供对外的服务,而对应的路径其实是不固定的,那么这种情况下,其实是可以通过这种方式来注册web组…...

Element组件案例 Vue路由 前端打包部署步骤

目录 Element组件案例案例需求与分析环境搭建整体布局顶部标题左侧导航栏核心-右侧导航栏表格编写表单编写分页工具栏编写 异步数据加载异步加载数据性别展示修复图片展示修复 Vue路由Vue路由简介Vue路由入门 打包部署前端工程打包部署前端工程nginx介绍部署 Element组件案例 …...

mysql5.7停止维护时间

mysql5.7将于2023年10月停止官网支持和更新;老项目要准备升级,新项目的mysql必须是mysql8.0(2023-10) 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…...

解密.kat6.l6st6r勒索病毒:保护数据的关键方法

导言: 网络威胁如雨后春笋,而 .kat6.l6st6r 勒索病毒则是其中一个异常狡猾的恶棍。本文91数据恢复将深入探讨 .kat6.l6st6r 勒索病毒的特点、数据恢复方法以及如何有效地预防这一数字威胁。 数据的重要性不容小觑,您可添加我们的技术服务号&a…...

Godot 添加信号

前言 Godot 里面C#和GDScirpt 的用法完全不一样,网上相关资料太少了。 什么是信号 信号分为信号源,触发,目的节点。信号源在某些条件下触发信号,比如按钮点击,鼠标悬停等事件 #mermaid-svg-wyr9ARVcBFmUUu8y {font-…...

JS如何判断文字是否溢出(被ellipsis)?

如果想要文本超出宽度后用省略号省略,只需要加上以下的css就行了。 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }3行css搞定,但是问题来了:如果我们想要当文本被省略的时候,也就是当文本超出指定…...

pb:常用函数和语句清单

pb:常用函数和语句清单 PB中提供了600多个函数,这还没有将B/S开发、数据窗口对象中的函数计算在内。但是,只要掌握、熟练运用、真正理解下面的这些函数(包括部分语句)就可以开发软件项目了。这些函数和语句是我给学员讲课时开发的一个完整的管理系统(提供了MIS必须的完整模…...

(8)SpringMVC中的视图类型及其特点,以及视图控制器view-controller的配置

SpringMVC的视图 转发和重定向的区别及其原理,参考文章 视图类型及特点 视图的作用就是将Model中的数据渲染到页面上并展示给用户,SpringMVC中视图对应的View接口有三种实现类对应三种视图解析器 默认有转发视图InternalResourceView和重定向视图RedirectView以及Thymeleaf…...

ansible学习笔记分享

yum install ansible -y #安装,注意yum源问题 yum源: yum install epel-release -y mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.bak >> /dev/null yum clean all rpm -Uvh http://mirrors.ustc.edu.cn/epel/epel-releas…...

以dzzoffice为例设置通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证)

在测试dzzoffice的过程中,需要配置邮件服务器,dzzoffice的邮件设置有三种选项: 1、通过 PHP 函数的 sendmail 发送(推荐此方式) 2、通过 SOCKET 连接 SMTP 服务器发送(支持 ESMTP 验证) 3、通过 PHP 函数 SMTP 发送 Email(仅 Windows 主机下有…...

加拿大艾伯塔省执法部门利用OpenText Encase显着提高案件效率

艾伯塔省执法部门利用OpenText Encase显着提高案件效率 Internet Child Exploitation Unit (ICE) 使用OpenText EnCase Forensic 加快结案进度并起诉更多罪犯 挑战 从证据收集到报告和起诉的过程非常耗时; 需要工具帮助快速可靠地收集、分析和存储数字证据。 结果 显著提高案…...

【Codeforces】Educational Codeforces Round 156 [Rated for Div. 2]

hh第一次记录cf。 复盘 ab题目比较清晰,只开了这两题,后面看了下cd,即使开了翻译也看不懂题目是什么意思,最后放弃睡觉了。。 a是一道思维题,翻了下别人写的发现大家写的各不相同hh b是一道数学题,过程有点…...

结合swagger的前端架构小记

1.引言 开发中,我们是否经常遇到以下痛点: 项目越大,启动和热更新越来越慢,启动都要花个3-5分钟以上没有类型,接口返回的Object不拿到真实数据都不知道有哪些字段需要手动写很多request函数去调用api,手动…...

Python字典全解析:从基础到高级应用

更多资料获取 📚 个人网站:涛哥聊Python 字典是一种强大而多才多艺的数据类型,它以键-值对的形式储存信息,让我们能够以惊人的效率处理和管理数据。 字典能够将键和值关联在一起,使得数据的存储和检索变得非常高效。…...

Fourier变换中的能量积分及其详细证明过程

Fourier变换中的能量积分及其详细证明过程 在使用Fourier变换分析信号时候,有时需要用到能量积分。本文对Fourier变换的能量积分进行分析。 一、Fourier变换中的能量积分 若 F ( ω ) F [ f ( t ) ] F(\omega)\mathscr F[f(t)] F(ω)F[f(t)],则有 ∫…...

保护 Web 服务器安全性

面向公众的系统(如 Web 服务器)经常成为攻击者的目标,如果这些业务关键资源没有得到适当的保护,可能会导致安全攻击,从而导致巨大的财务后果,并在客户中失去良好的声誉。 什么是网络服务器审核 当有人想要…...

docker数据管理和网络通信

docker数据管理 管理 Docker 容器中数据主要有两种方式: 数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。 1.数据卷 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机…...

代理IP与Socks5代理:网络工程师的神奇魔法棒

网络工程师是数字世界的魔法师,而代理IP和Socks5代理则是他们的神奇魔法棒。这两项技术在跨界电商、爬虫、出海业务、网络安全和游戏等领域中,为网络工程师提供了强大的工具,让他们能够创造技术的奇迹。本文将深入研究这些神奇魔法棒在不同领…...

【K8S系列】深入解析k8s 网络插件—kube-router

序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点 在现代容器化应用程序的世界中…...

Flutter的Platform介绍-跨平台开发,如何根据不同平台创建不同UI和行为

文章目录 Flutter跨平台概念介绍跨平台开发平台相关性Platform ChannelPlatform-specific UIPlatform Widgets 如何判断当前是什么平台实例 Platform 类介绍获取当前平台的名称检查当前平台其他属性 利用flutter设计跨Android和IOS平台应用的技巧1. 遵循平台的设计准则2. 使用平…...

29 - Go time 时间模块详解:时间处理、定时控制与底层设计

文章目录29 - Go time 时间模块详解:时间处理、定时控制与底层设计核心概念time 模块解决什么问题?Go 为什么不用字符串表示时间?time.Duration 是什么?小结基础使用示例获取当前时间时间格式化为什么是 2006-01-02?小…...

从V1到V3:手把手教你用PyTorch复现MobileNet进化史(附完整代码)

从V1到V3:手把手教你用PyTorch复现MobileNet进化史(附完整代码) 在移动端和嵌入式设备上部署深度学习模型一直是计算机视觉领域的核心挑战之一。2017年,Google推出的MobileNet系列彻底改变了轻量级卷积神经网络的设计范式&#xf…...

三自由度机械臂运动学建模与求解:从DH参数到算法验证

1. 三自由度机械臂运动学基础 刚接触机械臂控制时,我最头疼的就是运动学建模这部分。三自由度机械臂虽然结构简单,但要把它的运动规律用数学语言描述清楚,需要建立完整的理论框架。运动学主要研究机械臂末端执行器的位置、速度和加速度与各关…...

别再只会用digitalWrite了!用Arduino UNO的PWM引脚玩转RGB呼吸灯(附完整代码)

Arduino PWM实战:从呼吸灯到RGB色彩控制的深度探索 引言:为什么我们需要PWM? 想象一下,你第一次接触Arduino时,可能从最简单的Blink程序开始——让LED灯以固定频率闪烁。这种简单的开关控制能满足基础需求,…...

Vue2项目里,用lodash的debounce给搜索框‘降降温’(附完整代码和常见坑点)

Vue2实战:用lodash的debounce优化搜索框性能与避坑指南 搜索框是Web应用中最高频的交互组件之一,但处理不当可能成为性能黑洞。当用户快速输入"vue"、"react"等关键词时,传统实现会为每个字符触发搜索请求,导…...

Code-Act框架:让AI通过代码生成与执行实现智能体“动手”能力

1. 项目概述:Code-Act,一个让AI“动手”的智能体框架最近在AI智能体这个圈子里,一个叫“Code-Act”的项目热度挺高。它不是一个具体的应用,而是一个框架,一个旨在解决当前AI智能体“眼高手低”问题的底层工具。简单来说…...

别再乱买手机了!这 3 个坑 90% 的人都踩过,看完立省千元

救命!谁还没在买手机上交过 “智商税”?😭明明花了三四千,到手却卡顿发烫、拍照模糊、续航拉胯;销售吹得天花乱坠的 “旗舰配置”,用半年就后悔想砸手机!作为换过 5 台手机、踩遍所有雷的过来人…...

5分钟掌握OBS虚拟摄像头:让所有视频软件都能用上专业直播效果

5分钟掌握OBS虚拟摄像头:让所有视频软件都能用上专业直播效果 【免费下载链接】obs-virtual-cam 项目地址: https://gitcode.com/gh_mirrors/obs/obs-virtual-cam 你是否曾经羡慕主播们精美的直播画面,却苦于无法在Zoom、Teams等日常软件中实现同…...

生物信息学新手必看:用K-means和WGCNA分析转录组数据的保姆级流程(附R代码)

生物信息学实战:从K-means到WGCNA的转录组分析全流程指南 第一次接触转录组数据分析时,我盯着满屏的基因表达矩阵完全无从下手。那些论文里看似流畅的分析流程,在实际操作时却处处是坑——数据格式报错、参数设置不合理、结果解读模糊...这正…...

别再硬算幂函数了!FPGA图像处理中,用查找表(LUT)实现伽马校正的完整流程与资源优化

别再硬算幂函数了!FPGA图像处理中,用查找表(LUT)实现伽马校正的完整流程与资源优化 在实时图像处理系统中,伽马校正(Gamma Correction)是一个无法绕开的关键环节。无论是医疗影像的增强显示&…...