Springboot2

1、搭建环境

2、配置文件

application.properties

application.yml

3、springboot接收请求

spring+springmvc

接收请求

响应数据

4、springboot集成jdbc

spring-boot-starter-jdbc.jar

JdbcTemplate(update|query)

5、springboot自动装配原理(重点)

1.当启动项目时,会执行@SpringbootApplication 2.该注解会启动其下的@EnableAutoConfiguration(自动装配) 3.自动装配的注解就是从 组件自动装配选择器(AutoConfigurationImportSelector)中读取组件列表 4.组件列表(META-INF/spring.factories)中就列举了众多需要进行整合的组件 5.就会找到对一个的组件类(xxxAutoConfiguration) 6.在组件类的上方就会判断当前项目是否需要与此组件整合 (@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})) 7.如果判断当前项目没有此类,则不会进行该组件的加载 8.如果判断当前项目有此类,则会读取与该组件整合的配置文件 (@EnableConfigurationProperties({DataSourceProperties.class})) 9.如果读取失败,则装配失败,项目报错 10,如果读取成功,则装配成功,springboot与该技术即整合成功

总结:整合什么技术 -- 导入该技术的jar包(场景包) -- 设置相关的属性 -- 整合成功

结论:

  • SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration;

  • 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。

    • xxxxProperties里面拿。

    • xxxProperties和配置文件进行了绑定;

  • 生效的配置类就会给容器中装配很多组件;

  • 只要容器中有这些组件,相当于这些功能就有了;

6、文件上传

表结构

create table user(id int primary key auto_increment,username char(32),password char(128),img_path char(128)
)
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserDao userDao;
​@RequestMapping("/save")public R save(User user, MultipartFile file) throws IOException {//获取文件大小  字节数long size = file.getSize();System.out.println("文件大小字节数:"+size);//保存文件到服务器(本地磁盘)String path = "F:\\IdeaProjects\\springboot2\\src\\main\\resources\\static\\";//获取原始文件名String oldFileName = file.getOriginalFilename();//001.png//获取文件后缀String suffix = oldFileName.substring(oldFileName.lastIndexOf("."));String newFileName = UUID.randomUUID()+ suffix;IOUtils.copy(file.getInputStream(), new FileOutputStream(path+newFileName));//将文件名或者(相对路径+文件名)保存到数据库表中(文件服务器,保存绝对路径到数据库表中)user.setImgPath(newFileName);int num = userDao.save(user);return R.ok();}
@Repository
public class UserDaoImpl implements UserDao{@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic int save(User user) {String sql = "insert into user(username,password,img_path) values(?,?,?)";return jdbcTemplate.update(sql,user.getUsername(),user.getPassword(),user.getImgPath());}
}

7、文件下载

/*
下载文件*/
@RequestMapping("/download")
public void download(String filename,HttpServletResponse response) throws IOException {//根据下载的文件名,找到文件对象File f = new File("F:\\IdeaProjects\\springboot2\\src\\main\\resources\\static\\"+filename);InputStream in = new FileInputStream(f);//设置响应头response.setHeader("Content-Disposition","attachment;filename="+filename);//从输入流,copy到输出流IOUtils.copy(in,response.getOutputStream());//关闭流response.getOutputStream().close();in.close();
}

浏览器测试:http://localhost:8080/user/download?filename=001.png

8、过滤器filter(servlet、springmvc、springboot)

过滤器是tomcat提供的api组件,用于拦截客户端发过来的所有请求(web资源),并可以对请求和响应进行一些操作。

创建过滤器

package com.hl.springboot2.config;
​
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;
​
/*
@WebFilter 来自于servlet-api(tomcat)
springboot 默认不识别@WebFilter*/
@WebFilter(value = {"/*"})
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("filter...init");}/*每次请求都要访问doFilter(请求对象、响应对象、过滤器链)*/@Overridepublic void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException, ServletException {System.out.println("do....filter....");//业务逻辑HttpServletRequest request = (HttpServletRequest) servletRequest;//获取请求路径StringBuffer url = request.getRequestURL();//获取请求参数Map map = request.getParameterMap();//.....校验//放行,到达目标ControllerfilterChain.doFilter(servletRequest, servletResponse);}
​@Overridepublic void destroy() {System.out.println("filter..destroy");}
}

注册过滤器

@SpringBootApplication
//@ServletComponentScan 自动扫描所有的servlet组件 例如过滤器filter @WebFilter
@ServletComponentScan
public class Springboot2Application {
​public static void main(String[] args) {SpringApplication.run(Springboot2Application.class, args);}
​
}

9、拦截器Interceptor(专为springmvc设计的)

拦截器

它是springmvc提供的一个API组件,作用是用来拦截DispacherServlet发给controller的请求以及controller处理后的结果。

创建拦截器

/*
自定义的拦截器类*/
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {System.out.println("preHandle....前置拦截.....");return true;//true:放行   false:拦截}
​@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandler....后置拦截......");}
​@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion.....最后执行....");}
}

注册拦截器

@SpringBootApplication
//@ServletComponentScan 自动扫描所有的servlet组件 例如过滤器filter @WebFilter
@ServletComponentScan
public class Springboot2Application implements WebMvcConfigurer {
​public static void main(String[] args) {SpringApplication.run(Springboot2Application.class, args);}
​//配置自定义拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {//拦截路径---拦截器类registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")  //拦截路径.excludePathPatterns("/user/download");  //排除路径(不拦截的路径)}
}

10、重点

拦截器与过滤器的区别?

1.拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。

2.拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。

3.拦截器只能拦截控制器,过滤器可以拦截所有的资源:Servlet,JSP,HTML。

4.拦截器在控制器的生命周期中,可以多次被调用,过滤器在所有请求调用之前。

5.拦截器可以访问控制器上下文、值栈里的对象,而过滤器不能访问。

过滤器(Filter)的使用场景

过滤器是Servlet规范的一部分,工作在Web容器层面,主要用于处理HTTP请求和响应的预处理和后处理:

  1. 请求/响应预处理

    • 字符编码设置:统一设置请求和响应的字符编码

    • 敏感词过滤:对请求参数或响应内容进行敏感词替换

    • XSS防护:过滤潜在的XSS攻击脚本

  2. 安全控制

    • 权限验证:检查用户是否登录,未登录则重定向到登录页

    • IP黑名单:阻止特定IP的访问

    • HTTPS强制跳转:将HTTP请求重定向到HTTPS

  3. 日志记录

    • 记录请求信息:记录请求URL、参数、耗时等

    • 性能监控:记录请求处理时间

  4. 跨域处理

    • 设置CORS相关响应头

  5. 压缩处理

    • 对响应内容进行GZIP压缩

拦截器(Interceptor)的使用场景

拦截器是Spring框架提供的机制,工作在Spring MVC层面,可以访问Spring的上下文和业务对象:

  1. 权限验证

    • 细粒度的权限控制:基于角色或权限的访问控制

    • Token验证:JWT等令牌的验证

  2. 业务逻辑处理

    • 参数预处理:对Controller方法的参数进行预处理

    • 结果后处理:对Controller返回的结果进行统一处理

  3. 日志记录

    • 记录方法调用信息:记录Controller方法的入参、返回值

    • 业务操作日志:记录用户操作

  4. 性能监控

    • 记录方法执行时间

    • 慢请求报警

  5. 事务管理

    • 方法调用前开启事务,调用后提交或回滚

主要区别

特性过滤器(Filter)拦截器(Interceptor)
工作层面Servlet容器层面Spring MVC层面
依赖Servlet APISpring框架
执行顺序先于拦截器执行后于过滤器执行
访问对象只能访问ServletRequest可以访问HandlerMethod
异常处理无法使用Spring异常处理可以使用Spring异常处理

选择建议

  • 当需要处理与Servlet API相关的底层操作时,使用过滤器

  • 当需要与Spring框架深度集成,处理业务相关逻辑时,使用拦截器

  • 两者可以结合使用,过滤器处理底层请求,拦截器处理业务逻辑

实际开发中,通常过滤器用于处理跨域、编码、安全等基础功能,拦截器用于处理权限、日志等业务相关功能。

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

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

相关文章

【课堂笔记】核方法和Mercer定理

文章目录 Kernal引入定义Mercer定理描述有限情形证明一般情形证明 Kernal 引入 在实际数据中常常遇到不可线性分割的情况,此时通常需要将其映射到高维空间中,使其变得线性可分。例如二维数据: 通过映射 ϕ ( x 1 , x 2 ) ( x 1 2 , 2 x 1…

谈谈未来iOS越狱或巨魔是否会消失

2024年10月的预测,先说结论: 巨魔iOS17.1消失概率为99%。 因为巨魔强依赖的漏洞就是一个签名漏洞,攻击面有限又经过2轮修复,第3次出现漏洞的概率极低。而越狱的话由于系统组件和服务较多,所以出现漏洞概率高攻击面多&…

根据当前日期计算并选取上一个月和上一个季度的日期范围,用于日期控件的快捷选取功能

1.选择月份范围 代码如下&#xff1a; <el-date-picker v-model"value" type"monthrange" align"right" unlink-panels range-separator"至"start-placeholder"开始月份" end-placeholder"结束月份" :picker-…

用户栈的高效解析逻辑

一、背景 在之前的博客 内核逻辑里抓取用户栈的几种方法-CSDN博客 里&#xff0c;介绍了使用内核逻辑进行用户栈的函数地址的抓取逻辑&#xff0c;但是并没有涉及如何解析出函数符号的逻辑。 就如perf工具一样&#xff0c;它也是分为两个步骤&#xff0c;一个步骤是内核态抓取…

vue3 el-table 行号

在 Vue 3 中&#xff0c;使用 Element Plus 的 <el-table> 组件来创建表格时&#xff0c;如果你想添加行号&#xff08;即每一行的编号&#xff09;&#xff0c;可以通过自定义列来实现。下面是如何实现的步骤&#xff1a; 1. 安装 Element Plus 首先&#xff0c;确保你…

Linux:进程信号---信号的保存与处理

文章目录 1. 信号的保存1.1 信号的状态管理 2. 信号的处理2.1 用户态与内核态2.2 信号处理和捕捉的内核原理2.3 sigaction函数 3. 可重入函数4. Volatile5. SIGCHLD信号 序&#xff1a;在上一章中&#xff0c;我们对信号的概念及其识别的底层原理有了一定认识&#xff0c;也知道…

UML 图的细分类别及其应用

统一建模语言&#xff08;UML&#xff0c;Unified Modeling Language&#xff09;是一种用于软件系统建模的标准化语言&#xff0c;广泛应用于软件工程领域。UML 图分为多种类别&#xff0c;每种图都有其特定的用途和特点。本文将详细介绍 UML 图的细分类别&#xff0c;包括 类…

「极简」扣子(coze)教程 | 小程序UI设计进阶!控件可见性设置

大师兄在上一期的内容中对用户的UI做了一些简单的介绍。这期大师兄继续介绍UI设计上的进阶小技巧&#xff0c;帮我们获得更好的使用体验。 扣子&#xff08;coze&#xff09;编程 「极简」扣子(coze)教程 | 3分钟学会小程序UI设计&#xff01;从零开始创建页面和瓷片按钮 「极…

2025年渗透测试面试题总结-快手[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 快手[实习]安全工程师 一面问题分析与详细回答 1. 自我介绍 4. 项目问题与解决 7. 防止SQL注入&…

WordPress Madara插件存在文件包含漏洞(CVE-2025-4524)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…

互联网大厂Java面试场景:从Spring Boot到分布式缓存技术的探讨

互联网大厂Java面试场景&#xff1a;从Spring Boot到分布式缓存技术的探讨 场景描述 互联网大厂某次Java开发岗面试&#xff0c;主考官是一位严肃的技术专家&#xff0c;而应聘者则是搞笑的程序员“码农明哥”。面试围绕音视频场景的技术解决方案展开&#xff0c;探讨从Sprin…

leetcode hot100刷题日记——8.合并区间

class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {if(intervals.empty()){//复习empty函数啊&#xff0c;日记1有的return {};}// 按照区间的起始位置进行排序sort(intervals.begin(), intervals.end());vect…

Unity中GPU Instancing使用整理

GPU Instancing是一种绘制调用优化方法,可在单个绘制调用中渲染具有相同材质Mesh的多个副本(实例),可用于绘制在场景中多次出现的几何体(例如,树木或灌木丛),在同一绘制调用中渲染相同的网格,每个实例可以具有不同的属性(如 Color 或 Scale),渲染多个实例的绘制调用…

【后端】【UV】【Django】 `uv` 管理的项目中搭建一个 Django 项目

&#x1f680; 一步步搭建 Django 项目&#xff08;适用于 uv pyproject.toml 项目结构&#xff09; &#x1f9f1; 第 1 步&#xff1a;初始化一个 uv 项目&#xff08;如果还没建好&#xff09; uv init django-project # 创建项目&#xff0c;类似npm create vue⚙️ 第 …

Linux操作系统之进程(二):进程状态

目录 前言 一、补充知识点 1、并行与并发 2、时间片 3、 等待的本质 4、挂起 二. 进程的基本状态 三、代码演示 1、R与S 2、T 3、Z 四、孤儿进程 总结&#xff1a; 前言 在操作系统中&#xff0c;进程是程序执行的基本单位。每个进程都有自己的状态&#xff0c;这些…

大数据技术全景解析:HDFS、HBase、MapReduce 与 Chukwa

大数据技术全景解析&#xff1a;HDFS、HBase、MapReduce 与 Chukwa 在当今这个信息爆炸的时代&#xff0c;大数据已经成为企业竞争力的重要组成部分。从电商的用户行为分析到金融的风险控制&#xff0c;从医疗健康的数据挖掘到智能制造的实时监控&#xff0c;大数据技术无处不…

学习 Android(十一)Service

简介 在 Android 中&#xff0c;Service 是一种无界面的组件&#xff0c;用于在后台执行长期运行或跨进程的任务&#xff0c;如播放音乐、网络下载或与远程服务通信 。Service 可分为“启动型&#xff08;Started&#xff09;”和“绑定型&#xff08;Bound&#xff09;”两大…

投标环节:如何科学、合理地介绍 Elasticsearch 国产化替代方案——Easysearch?

一、Easysearch 定义 Easysearch 是由极限科技&#xff08;INFINI Labs&#xff09;自主研发的分布式搜索型数据库&#xff0c;作为 Elasticsearch 的国产化替代方案&#xff0c;基于 Elasticsearch 7.10.2 开源版本深度优化[1]。 插一句&#xff1a;Elasticsearch 7.10.2 是里…

NVC++ 介绍与使用指南

文章目录 NVC 介绍与使用指南NVC 简介安装 NVC基本使用编译纯 C 程序编译 CUDA C 程序 关键编译选项示例代码使用标准并行算法 (STDPAR)混合 CUDA 和 C 优势与限制优势限制 调试与优化 NVC 介绍与使用指南 NVC 是 NVIDIA 提供的基于 LLVM 的 C 编译器&#xff0c;专为 GPU 加速…

Veo 3 可以生成视频,并附带配乐

谷歌最新的视频生成 AI 模型 Veo 3 可以创建与其生成的剪辑相配的音频。 周二&#xff0c;在谷歌 I/O 2025 开发者大会上&#xff0c;谷歌发布了 Veo 3。该公司声称&#xff0c;这款产品可以生成音效、背景噪音&#xff0c;甚至对话&#xff0c;为其制作的视频增添配乐。谷歌表…