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請求和響應的預處理和后處理:
-
請求/響應預處理
-
字符編碼設置:統一設置請求和響應的字符編碼
-
敏感詞過濾:對請求參數或響應內容進行敏感詞替換
-
XSS防護:過濾潛在的XSS攻擊腳本
-
-
安全控制
-
權限驗證:檢查用戶是否登錄,未登錄則重定向到登錄頁
-
IP黑名單:阻止特定IP的訪問
-
HTTPS強制跳轉:將HTTP請求重定向到HTTPS
-
-
日志記錄
-
記錄請求信息:記錄請求URL、參數、耗時等
-
性能監控:記錄請求處理時間
-
-
跨域處理
-
設置CORS相關響應頭
-
-
壓縮處理
-
對響應內容進行GZIP壓縮
-
攔截器(Interceptor)的使用場景
攔截器是Spring框架提供的機制,工作在Spring MVC層面,可以訪問Spring的上下文和業務對象:
-
權限驗證
-
細粒度的權限控制:基于角色或權限的訪問控制
-
Token驗證:JWT等令牌的驗證
-
-
業務邏輯處理
-
參數預處理:對Controller方法的參數進行預處理
-
結果后處理:對Controller返回的結果進行統一處理
-
-
日志記錄
-
記錄方法調用信息:記錄Controller方法的入參、返回值
-
業務操作日志:記錄用戶操作
-
-
性能監控
-
記錄方法執行時間
-
慢請求報警
-
-
事務管理
-
方法調用前開啟事務,調用后提交或回滾
-
主要區別
特性 | 過濾器(Filter) | 攔截器(Interceptor) |
---|---|---|
工作層面 | Servlet容器層面 | Spring MVC層面 |
依賴 | Servlet API | Spring框架 |
執行順序 | 先于攔截器執行 | 后于過濾器執行 |
訪問對象 | 只能訪問ServletRequest | 可以訪問HandlerMethod |
異常處理 | 無法使用Spring異常處理 | 可以使用Spring異常處理 |
選擇建議
-
當需要處理與Servlet API相關的底層操作時,使用過濾器
-
當需要與Spring框架深度集成,處理業務相關邏輯時,使用攔截器
-
兩者可以結合使用,過濾器處理底層請求,攔截器處理業務邏輯
實際開發中,通常過濾器用于處理跨域、編碼、安全等基礎功能,攔截器用于處理權限、日志等業務相關功能。