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.pswp.cn/web/80804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80804.shtml
英文地址,請注明出處:http://en.pswp.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;為其制作的視頻增添配樂。谷歌表…