天天看點

springmvc中自定義攔截器、檔案上傳

聲明,使用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配置檔案中配置自定義的攔截器,使其生效;

子子產品目錄結構:

springmvc中自定義攔截器、檔案上傳

自定義的攔截器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生效:

springmvc中自定義攔截器、檔案上傳

由 < 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:

springmvc中自定義攔截器、檔案上傳

攔截器和過濾器的差別:

兩者的本質差別:攔截器(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請求:

springmvc中自定義攔截器、檔案上傳

status:200 OK ,請求成功:

springmvc中自定義攔截器、檔案上傳

繼續閱讀