Java全面深入探究SpringBoot攔截器與文件上傳
攔截器
攔截器的概念
動(dòng)態(tài)攔截Actioon調(diào)用的對(duì)象,使開發(fā)者在一個(gè)Actioon執(zhí)行的前后執(zhí)行一段代碼,也可以在Action執(zhí)行前阻止其執(zhí)行,同時(shí)也提供了一種可以提取Action中可重用部分代碼的方式。
作用:
動(dòng)態(tài)攔截Action調(diào)用的對(duì)象(也就是實(shí)際項(xiàng)目中的controller層的接口)
一般攔截器用于對(duì)用戶訪問的限制。如當(dāng)用戶沒有登錄時(shí)訪問主頁(yè)面,則可以使用攔截器進(jìn)行攔截并重定向到登錄頁(yè)面。
攔截器的配置
創(chuàng)建interceptor 文件夾并創(chuàng)建LoginInterceptor Java文件且實(shí)現(xiàn)HandlerInterceptor 這個(gè)接口。
//必須實(shí)現(xiàn)HandlerInterceptor這個(gè)接口
public class LoginInterceptor implements HandlerInterceptor {
/*
* 目標(biāo)方法執(zhí)行以前
* */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser != null) {
return true;
}
request.setAttribute("msg" ,"請(qǐng)登錄!");
// response.sendRedirect("/");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
//目標(biāo)方法執(zhí)行以后
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 頁(yè)面渲染以后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}配置攔截器
創(chuàng)建 config 文件夾并創(chuàng)建 AdminWebConfig 文件并實(shí)現(xiàn)WebMvcConfigurer的addInterceptors。
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") //靜態(tài)路徑也會(huì)被攔截
.excludePathPatterns("/","/login","/css/**","/fonts/**" ,"/images/**","/js/**");
}
}
攔截器的原理
1、根據(jù)當(dāng)前請(qǐng)求,找到**HandlerExecutionChain【**可以處理請(qǐng)求的handler以及handler的所有 攔截器】
2、先來順序執(zhí)行 所有攔截器的 preHandle方法
- 1、如果當(dāng)前攔截器prehandler返回為true。則執(zhí)行下一個(gè)攔截器的preHandle
- 2、如果當(dāng)前攔截器返回為false。直接 倒序執(zhí)行所有已經(jīng)執(zhí)行了的攔截器的 afterCompletion;
3、如果任何一個(gè)攔截器返回false。直接跳出不執(zhí)行目標(biāo)方法
4、所有攔截器都返回True。執(zhí)行目標(biāo)方法
5、倒序執(zhí)行所有攔截器的postHandle方法。
6、前面的步驟有任何異常都會(huì)直接倒序觸發(fā) afterCompletion
7、頁(yè)面成功渲染完成以后,也會(huì)倒序觸發(fā) afterCompletion
文件上傳
在之前我們學(xué)習(xí)SSM的時(shí)候就知道了 文件上傳 這個(gè)功能,所以在 SpringBoot中我們就不在過多介紹,原理其實(shí)都差不多。
前端文件:
<form method="post" action="/upload" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
Controller層的配置:
@Controller
public class FileController {
@GetMapping("/updateFile")
public String FileUp(){
return "FileUp";
}
@PostMapping("/upload") // //new annotation since 4.3
public String singleFileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
return "redirect:uploadStatus";
}
try {
// Get the file and save it somewhere
byte[] bytes = file.getBytes();
Path path = Paths.get( file.getOriginalFilename());
Files.write(path, bytes);
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded '" + file.getOriginalFilename() + "'");
} catch (IOException e) {
e.printStackTrace();
}
return "redirect:/main.html";
}
}更改文件上傳大小
在application.properties中配置文件大?。?/p>
spring.servlet.multipart.max-file-size=10MB //單文件大小
spring.servlet.multipart.max-request-size=100MB //多文件
到此這篇關(guān)于Java全面深入探究SpringBoot攔截器與文件上傳的文章就介紹到這了,更多相關(guān)Java SpringBoot攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java設(shè)計(jì)模式之策略模式(Strategy模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式(Strategy模式)介紹,Strategy是屬于設(shè)計(jì)模式中對(duì)象行為型模式,要是定義一系列的算法,這些算法一個(gè)個(gè)封裝成單獨(dú)的類,需要的朋友可以參考下2015-03-03
深入探究Java線程的創(chuàng)建與構(gòu)造方法
這篇文章主要給大家分享的是java線程的創(chuàng)建以及構(gòu)造方法,想了解具體方式的小伙伴可以參考下面文章內(nèi)容,希望對(duì)你有所幫助2022-04-04
SSM?Mapper文件查詢出返回?cái)?shù)據(jù)查不到個(gè)別字段的問題
這篇文章主要介紹了SSM?Mapper文件查詢出返回?cái)?shù)據(jù)查不到個(gè)別字段的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
springboot 動(dòng)態(tài)數(shù)據(jù)源的實(shí)現(xiàn)方法(Mybatis+Druid)
這篇文章主要介紹了springboot 動(dòng)態(tài)數(shù)據(jù)源的實(shí)現(xiàn)方法(Mybatis+Druid),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
java使用@Transactional時(shí)常犯的N種錯(cuò)誤
@Transactional是我們?cè)谟肧pring時(shí)候幾乎逃不掉的一個(gè)注解,本文主要介紹了使用?@Transactional?時(shí)常犯的N種錯(cuò)誤,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01

