聲明,使用JDK8、maven3.5.4、idea2018.2、spring5.0.7
springmvc中的攔截器,用于攔截前端發起的請求;
當請求到達DispatcherServlet前端控制器,DispatcherServlet根據請求路徑到HandlerMapping查詢具體的Handler,從HandlerMapping傳回的值是一個HandlerExecutionChain執行鍊,
執行鍊包含一個具體的Handler對象和Interceptors(攔截器集合、存在的話就包括)。
一、自定義攔截器MyInterceptor
步驟:
1、自定義一個攔截器實作interceptor接口;
2、把MyInterceptor添加到springmvc,在 springmvc-servlet.xml配置檔案中配置自定義的攔截器,使其生效;
子子產品目錄結構:
自定義的攔截器MyInterceptor :
/**
* @auther SyntacticSugar
* @data 2018/11/16 0016下午 12:22
*/
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("prehandle....");
return true; //傳回true 、放行;false時候直接afterCompletion
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("posthandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("aftercompletion");
}
}
添加MyInterceptor 到springmvc中;
/* 表示攔截單級資源路徑,比如/hello
/** 表示攔截多個資源路徑 ,比如 /hello/test1
/ 表示根目錄下所有的資源 ,即該項目下所有的請求級别路徑
通路url進行測試:http://localhost:8080/users
<!-- 配置攔截器、可以配置多個 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.baidu.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
測試結果、自定義的interceptor生效:
由 < mvc:interceptors> 可以看出,攔截器可以配置多個,同時,handler 傳回的執行鍊 HandlerExecutionChain 中也可能包含多個interceptors;
可以配置多個interceptor、執行順序如下;
/
->interceptor1—>interceptor2—>interceptor3---->interceptorN---->Controller處理業務
->Controller傳回結果---->postHandleN—>postHandle3–postHandle2–>postHandle1
->postHandle1---->View視圖處理器渲染---->把渲染結果傳回
afterCompletionN–>afterCompletion3—>afterCompletion2—>afterCompletion1
當攔截器prehandle方法傳回值false時候,interceptor不放行,直接傳回afterCompletion:
攔截器和過濾器的差別:
兩者的本質差別:攔截器(Interceptor)是基于Java的反射機制,而過濾器(Filter)是基于函數回調。
從靈活性上說攔截器功能更強大些,Filter能做的事情,都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL位址做一個編碼的事情、過濾掉沒用的參數、安全校驗
、
(1)、Filter需要在web.xml中配置,依賴于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依賴于架構;
(3)、Filter的執行順序在Interceptor之前;
參考博文 https://blog.csdn.net/zxd1435513775/article/details/80556034
上傳檔案:
上傳檔案的表單,送出方式一定要是POST;表單類型一定要是multipart/form-data,表示可以上傳檔案等二進制資料。
1、引入依賴、springmvc-servlet.xml中配置檔案上傳解析器;
2、寫controller
3、使用postman進行測試、或者使用Advanced REST client:
依賴:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
配置springmvc-servlet檔案:
<!--配置檔案 上傳解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置預設編碼、上傳的大小 -->
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="10485760"/>
</bean>
定義上傳檔案的參數為file類型;
@RequestParam注解,定義請求參數;
package com.baidu.controller;
/**
* @auther SyntacticSugar
* @data 2018/11/16 0016上午 11:55
*/
@Controller
public class UploadController {
@RequestMapping("upload")
public String upload(@RequestParam("file")MultipartFile file){
if (file!=null) {
try {
file.transferTo(new File("D:/upload/"+file.getOriginalFilename()));
} catch (Exception e) {
e.printStackTrace();
}
}
// 上傳成功轉發至 success.html 頁面
return "redirect:success.html";
}
}
發送post請求:
status:200 OK ,請求成功: