中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springMVC如何自定義攔截器

發布時間:2022-10-25 13:59:09 來源:億速云 閱讀:139 作者:iii 欄目:編程語言

這篇文章主要介紹“springMVC如何自定義攔截器”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“springMVC如何自定義攔截器”文章能幫助大家解決問題。

一、概述

springMVC也可以使用攔截器對請求攔截處理,用戶可以自定義攔截器來實現特定的功能,自定義攔截器必須實現HanderInterceptor接口;

HanderInterceptor接口方法有:preHandle、postHandle、afterCompletion;

preHandle:

這個方法在業務處理器處理請求之前被調用,在該方法中對用戶請求request進行處理。如果程序員決定該攔截器對請求進行攔截處理后還要調用其他的攔截器,或者是業務處理器去進行處理,則返回true;如果程序員決定不需要再調用其他的組件去處理請求,則返回false;

postHandle:

這個方法在業務處理器處理完請求后,但是DispatcherServlet向客戶端返回響應前被調用;在該方法中對用戶請求request進行處理;

afterCompletion:

這個方法在DispatcherServlet完全處理完請求后被調用;可以在該方法中進行一些資源清理的操作;

二、攔截器配置和實例驗證

目錄結構:

springMVC如何自定義攔截器

1.配置:

web.xml配置:只配置了DispatcherServlet

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5     id="WebApp_ID" version="3.1">
 6     <servlet>
 7         <servlet-name>springDispatcherServlet</servlet-name>
 8         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 9         <!-- 配置DispatcherServletd 一個初始化參數:配置springmvc配置文件的位置和名稱 -->
10         <!-- 實際上也可以不通過 contextConfigLocation 來配置Springmvc的配置文件,而是用默認的 即默認的配置文件為 
11             /WEB-INF/<servlet-name>-servlet.xml 本項目默認位置配置文件即為: /WEB-INF/springDispatcherServlet-servlet.xml -->
12         <init-param>
13             <param-name>contextConfigLocation</param-name>
14             <param-value>classpath:spring.xml</param-value>
15         </init-param>
16         <!-- 表示springDispatcherServlet在加載的時候被創建 -->
17         <load-on-startup>1</load-on-startup>
18     </servlet>
19 
20     <!-- Map all requests to the DispatcherServlet for handling -->
21     <servlet-mapping>
22         <servlet-name>springDispatcherServlet</servlet-name>
23         <url-pattern>/</url-pattern>
24     </servlet-mapping>
25 </web-app>

spring.xml配置:基礎配置+攔截器配置;

基礎配置包括:包掃描的配置、視圖解析器配置、<mvc:annotation-driven></mvc:annotation-driven>;

攔截器配置:

<mvc:interceptors>
        <!-- 配置自定義攔截器 -->
        <bean class="interceptors.FirstInterceptor"></bean>
    </mvc:interceptors>

完整文件:

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:mvc="http://www.springframework.org/schema/mvc"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <context:component-scan base-package="handler"></context:component-scan>
11     <!-- 配置視圖解析器 如何把handler 方法返回值解析為實際的物理視圖 -->
12     <bean
13         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
14         <property name="prefix" value="/WEB-INF/views/"></property>
15         <property name="suffix" value=".jsp"></property>
16     </bean>
17         
18     <mvc:annotation-driven></mvc:annotation-driven>
19     
20     <mvc:interceptors>
21         <!-- 配置自定義攔截器 -->
22         <bean class="interceptors.FirstInterceptor"></bean>
23     </mvc:interceptors>
24     
25 </beans>

2.攔截器FirstInterceptor.java:

必須實現HanderInterceptor接口

1 package interceptors;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 import org.springframework.web.servlet.HandlerInterceptor;
 7 import org.springframework.web.servlet.ModelAndView;
 8 
 9 /**
10  * 攔截器<br>
11  * 多個攔截器的情況:preHandle 順序執行;postHandle倒敘執行;afterCompletion倒敘執行
12  * 
13  * @author lixiuming
14  *
15  */
16 public class FirstInterceptor implements HandlerInterceptor {
17     /**
18      * 該方法在目標方法之前被調用<br>
19      * 若返回值為true,則繼續調用后續的攔截器和目標方法<br>
20      * 若返回值為false,則不會再執行后續的攔截器和目標方法;<br>
21      * 使用場景可以考慮做權限,日志、事務等
22      */
23     @Override
24     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
25             throws Exception {
26         System.out.println("preHandle");
27         // TODO Auto-generated method stub
28         return HandlerInterceptor.super.preHandle(request, response, handler);
29     }
30 
31     /**
32      * 調用目標方法之后,但渲染視圖之前被調用;使用場景 可以對請求域中的屬性或者視圖做出修改
33      */
34     @Override
35     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
36             ModelAndView modelAndView) throws Exception {
37         System.out.println("postHandle");
38         // TODO Auto-generated method stub
39         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
40     }
41 
42     /**
43      * 渲染視圖之后被調用; 使用場景:釋放資源
44      */
45     @Override
46     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
47             throws Exception {
48         System.out.println("afterCompletion");
49         // TODO Auto-generated method stub
50         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
51     }
52 
53

3.EmployeeController.java

1 package handler;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 
 6 @RequestMapping("/emp")
 7 @Controller
 8 public class EmployeeController {
 9 
10     @RequestMapping("/testInteceptors")
11     public String testFileUpload() {
12         System.out.println("testInteceptors");
13         return "success";
14     }
15

4.success.jsp

1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta charset="UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10 success
11 </body>
12 </html>

5.運行結果&流程:

訪問http://localhost:8080/DataOperate/emp/testInteceptors時,頁面跳轉到success頁面;且控制臺臺打印了:

preHandle

testInteceptors

postHandle

afterCompletion

三、多個攔截器:

spring.xml配置特定路徑的攔截器:

這里的路徑是訪問路徑是/emp/testIndex,也就是說,訪問/emp/testIndex時,調用第二個攔截器;

1 <mvc:interceptors>
2         <!-- 配置自定義攔截器 -->
3         <bean class="interceptors.FirstInterceptor"></bean>
4         <!-- 配置攔截器(不)作用的路徑 -->
5         <mvc:interceptor>
6             <mvc:mapping path="/emp/testIndex"/>
7             <bean class="interceptors.SecondInterceptor"></bean>
8         </mvc:interceptor>
9     </mvc:interceptors>

攔截器:SecondInterceptor.java:

1 package interceptors;
 2 
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletResponse;
 5 
 6 import org.springframework.web.servlet.HandlerInterceptor;
 7 import org.springframework.web.servlet.ModelAndView;
 8 
 9 /**
10  * 攔截器
11  * 
12  * @author lixiuming
13  *
14  */
15 public class SecondInterceptor implements HandlerInterceptor {
16     /**
17      * 該方法在目標方法之前被調用<br>
18      * 若返回值為true,則繼續調用后續的攔截器和目標方法<br>
19      * 若返回值為false,則不會再執行后續的攔截器和目標方法;<br>
20      * 使用場景可以考慮做權限,日志、事務等
21      */
22     @Override
23     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
24             throws Exception {
25         System.out.println("SecondInterceptor preHandle");
26         // TODO Auto-generated method stub
27         return HandlerInterceptor.super.preHandle(request, response, handler);
28     }
29 
30     /**
31      * 調用目標方法之后,但渲染視圖之前被調用;使用場景 可以對請求域中的屬性或者視圖做出修改
32      */
33     @Override
34     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
35             ModelAndView modelAndView) throws Exception {
36         System.out.println(" SecondInterceptor postHandle");
37         // TODO Auto-generated method stub
38         HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
39     }
40 
41     /**
42      * 渲染視圖之后被調用; 使用場景:釋放資源
43      */
44     @Override
45     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
46             throws Exception {
47         System.out.println(" SecondInterceptor afterCompletion");
48         // TODO Auto-generated method stub
49         HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
50     }
51 
52

EmployeeController.java添加方法:

1 package handler;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 
 6 @RequestMapping("/emp")
 7 @Controller
 8 public class EmployeeController {
 9 
10     @RequestMapping("/testInteceptors")
11     public String testFileUpload() {
12         System.out.println("testInteceptors");
13         return "success";
14     }
15 
16     @RequestMapping("/testIndex")
17     public String testIndex() {
18         System.out.println("testInteceptors");
19         return "forward:/index.jsp";
20     }
21

index.jsp:

1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.util.*"%>
 4 <!DOCTYPE html>
 5 <html>
 6 <head>
 7 <meta charset="UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 <h4>welcom to lean interceptor !</h4>
12     
13     
14 </body>
15 </html>

運行結果:

訪問:http://localhost:8080/DataOperate/emp/testInteceptors時,頁面跳轉到success頁面;且控制臺臺打印了:

preHandle

testInteceptors

postHandle

afterCompletion

訪問:http://localhost:8080/DataOperate/emp/testIndex時,頁面跳轉到index.jsp頁面;且控制臺臺打印了:

preHandle

SecondInterceptor preHandle

testInteceptors

 SecondInterceptor postHandle

postHandle

 SecondInterceptor afterCompletion

afterCompletion

 多個攔截器運行流程:多個攔截器的情況:preHandle 順序執行;postHandle倒敘執行;afterCompletion倒敘執行

springMVC如何自定義攔截器

關于“springMVC如何自定義攔截器”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜都市| 庄河市| 咸丰县| 北宁市| 保山市| 天津市| 荥经县| 肇东市| 合阳县| 平乡县| 湘乡市| 雅江县| 寻甸| 公安县| 安顺市| 稷山县| 于都县| 桑日县| 司法| 翁牛特旗| 聂拉木县| 西乡县| 潮州市| 钦州市| 莒南县| 阿城市| 崇礼县| 肥乡县| 陆良县| 靖安县| 陵川县| 比如县| 双牌县| 综艺| 曲麻莱县| 西乡县| 襄城县| 景东| 宁都县| 六盘水市| 嘉兴市|