最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解HandlerInterceptor處理器攔截器的用法

 更新時(shí)間:2023年07月10日 14:39:45   作者:朱又燉粉條  
這篇文章主要介紹了HandlerInterceptor處理器攔截器的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

HandlerInterceptor處理器攔截器用法

SpringMVC 中的HandlerInterceptor 攔截器類似于Servlet開發(fā)中的過濾器Filter,用于對(duì)處理器進(jìn)行預(yù)處理和后處理。

(如無特殊說明,下文所說的攔截器即處理器攔截器)

SpringMVC 中的Interceptor 攔截請(qǐng)求是通過HandlerInterceptor 來實(shí)現(xiàn)的。

在SpringMVC 中定義一個(gè)Interceptor 非常簡單,主要有兩種方式

  • 第一種方式:是要定義的Interceptor類要實(shí)現(xiàn)了Spring 的HandlerInterceptor 接口,或者是這個(gè)類繼承實(shí)現(xiàn)了HandlerInterceptor 接口的類,比如Spring 已經(jīng)提供的實(shí)現(xiàn)了HandlerInterceptor 接口的抽象類HandlerInterceptorAdapter ;
  • 第二種方式:是實(shí)現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實(shí)現(xiàn)了WebRequestInterceptor的類。

1.攔截器接口

先看下面的攔截器接口:

package org.springframework.web.servlet;  
public interface HandlerInterceptor {  
    boolean preHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler)   
            throws Exception;  
    void postHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, ModelAndView modelAndView)   
            throws Exception;  
    void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, Exception ex)  
            throws Exception;  
}   

我們可能注意到攔截器一個(gè)有3個(gè)回調(diào)方法,而一般的過濾器Filter才兩個(gè),這是怎么回事呢?馬上分析。

preHandle

預(yù)處理回調(diào)方法,實(shí)現(xiàn)處理器的預(yù)處理(如登錄檢查),第三個(gè)參數(shù)為響應(yīng)的處理器(如:Controller實(shí)現(xiàn));

preHandle方法是進(jìn)行處理器攔截用的,顧名思義,該方法將在Controller處理之前進(jìn)行調(diào)用,     

* SpringMVC中的Interceptor攔截器是鏈?zhǔn)降?,可以同時(shí)存在多個(gè)Interceptor,
* 然后SpringMVC會(huì)根據(jù)聲明的前后順序一個(gè)接一個(gè)的執(zhí)行,
* 而且所有的Interceptor中的preHandle方法都會(huì)在Controller方法調(diào)用之前調(diào)用。
* SpringMVC的這種Interceptor鏈?zhǔn)浇Y(jié)構(gòu)也是可以進(jìn)行中斷的,
* 這種中斷方式是令preHandle的返回值為false,當(dāng)preHandle的返回值為false的時(shí)候整個(gè)請(qǐng)求就結(jié)束了。

返回值:true表示繼續(xù)流程(如調(diào)用下一個(gè)攔截器或處理器);

false表示流程中斷(如登錄檢查失?。?,不會(huì)繼續(xù)調(diào)用其他的攔截器或處理器,此時(shí)我們需要通過response來產(chǎn)生響應(yīng);

postHandle

后處理回調(diào)方法,實(shí)現(xiàn)處理器的后處理(但在渲染視圖之前),此時(shí)我們可以通過modelAndView(模型和視圖對(duì)象)對(duì)模型數(shù)據(jù)進(jìn)行處理或?qū)σ晥D進(jìn)行處理,modelAndView也可能為null。

* 這個(gè)方法只會(huì)在當(dāng)前這個(gè)Interceptor的preHandle方法返回值為true的時(shí)候才會(huì)執(zhí)行。
* postHandle是進(jìn)行處理器攔截用的,它的執(zhí)行時(shí)間是在處理器進(jìn)行處理之后, 也就是在Controller的方法調(diào)用之后執(zhí)行,
* 但是它會(huì)在DispatcherServlet進(jìn)行視圖的渲染之前執(zhí)行,也就是說在這個(gè)方法中你可以對(duì)ModelAndView進(jìn)行操作。
* 這個(gè)方法的鏈?zhǔn)浇Y(jié)構(gòu)跟正常訪問的方向是相反的,也就是說先聲明的Interceptor攔截器該方法反而會(huì)后調(diào)用。

afterCompletion

整個(gè)請(qǐng)求處理完畢回調(diào)方法,即在視圖渲染完畢時(shí)回調(diào),如性能監(jiān)控中我們可以在此記錄結(jié)束時(shí)間并輸出消耗時(shí)間,還可以進(jìn)行一些資源清理,類似于try-catch-finally中的finally,但僅調(diào)用處理器執(zhí)行鏈中preHandle返回true的攔截器的afterCompletion。

* 該方法也是需要當(dāng)前對(duì)應(yīng)的Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。
* 該方法將在整個(gè)請(qǐng)求完成之后,也就是DispatcherServlet渲染了視圖執(zhí)行, 這個(gè)方法的主要作用是用于清理資源的。

2.攔截器適配器

有時(shí)候我們可能只需要實(shí)現(xiàn)三個(gè)回調(diào)方法中的某一個(gè),如果實(shí)現(xiàn)HandlerInterceptor接口的話,三個(gè)方法必須實(shí)現(xiàn),不管你需不需要,此時(shí)spring提供了一個(gè)HandlerInterceptorAdapter適配器(一種適配器設(shè)計(jì)模式的實(shí)現(xiàn)),允許我們只實(shí)現(xiàn)需要的回調(diào)方法。

public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {  
     //省略代碼 此處所以三個(gè)回調(diào)方法都是空實(shí)現(xiàn),preHandle返回true。  
}  

正常運(yùn)行流程圖:

中斷流程圖:

中斷流程中,比如是HandlerInterceptor4中斷的流程(preHandle返回false),此處僅調(diào)用它之前攔截器HandlerInterceptor3的preHandle返回true的afterCompletion方法。 

3.配置攔截器

使用mvc:interceptors標(biāo)簽來聲明需要加入到SpringMVC攔截器鏈中的攔截器。 

在springMVC.xml配置文件增加:

 <mvc:interceptors>
    <mvc:interceptor>
     <mvc:mapping path="/**" />
     <mvc:exclude-mapping path="/static/**" />
     <bean class="攔截器java代碼路徑" />
    </mvc:interceptor>
 </mvc:interceptors>

說明:

  • 1)mvc:mapping 攔截器路徑配置
  • 2)mvc:exclude-mapping 攔截器不需要攔截的路徑

示例:

上面的示例可以看出可以利用mvc:interceptors標(biāo)簽聲明一系列的攔截器,然后它們就可以形成一個(gè)攔截器鏈,攔截器的執(zhí)行順序是按聲明的先后順序執(zhí)行的,先聲明的攔截器中的preHandle方法會(huì)先執(zhí)行,然而它的postHandle方法和afterCompletion方法卻會(huì)后執(zhí)行。

4.示例

下面是一個(gè)登錄攔截器的例子:

package cn.wmyskxz.interceptor;
import cn.wmyskxz.pojo.User;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
/**
 * 登錄攔截器:
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		HttpSession session = request.getSession();
		String[] noNeedAuthPage = new String[]{
				"/home",
				"/searchProduct",
				"/sortProduct",
				"/showProduct",
				"/loginPage",
				"/login",
				"/registerPage",
				"/register",
				"/registerSuccessPage",
				"/test",
				"/checkLogin",
				"/admin"
		};
		String uri = request.getRequestURI();
		if (!Arrays.asList(noNeedAuthPage).contains(uri)) {
			User user = (User) session.getAttribute("user");
			if (null == user) {
				response.sendRedirect("/loginPage");
				return false;
			}
		}
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}
}

該攔截器作用就是對(duì)于所有不需要授權(quán)的請(qǐng)求(字符串?dāng)?shù)組noNeedAuthPage中列出的),正常執(zhí)行Controller,否則重定向到loginPage頁面。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java中關(guān)于命令執(zhí)行匯總

    java中關(guān)于命令執(zhí)行匯總

    這篇文章主要介紹了java中關(guān)于命令執(zhí)行匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring TaskScheduler使用實(shí)例解析

    Spring TaskScheduler使用實(shí)例解析

    這篇文章主要介紹了Spring TaskScheduler使用實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java實(shí)現(xiàn)KFC點(diǎn)餐系統(tǒng)過程解析

    Java實(shí)現(xiàn)KFC點(diǎn)餐系統(tǒng)過程解析

    這篇文章主要介紹了Java實(shí)現(xiàn)KFC點(diǎn)餐系統(tǒng)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Spring自帶的校驗(yàn)框架Validation的使用實(shí)例

    Spring自帶的校驗(yàn)框架Validation的使用實(shí)例

    今天小編就為大家分享一篇關(guān)于Spring自帶的校驗(yàn)框架Validation的使用實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Go Java算法之比較版本號(hào)方法詳解

    Go Java算法之比較版本號(hào)方法詳解

    這篇文章主要為大家介紹了Go Java算法之比較版本號(hào)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 基于@RequestParam name和value屬性的區(qū)別

    基于@RequestParam name和value屬性的區(qū)別

    這篇文章主要介紹了@RequestParam name和value屬性的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java利用Apache POI實(shí)現(xiàn)多模板Word文檔生成的示例代碼

    Java利用Apache POI實(shí)現(xiàn)多模板Word文檔生成的示例代碼

    當(dāng) Word 模板文檔的內(nèi)容是復(fù)雜表單時(shí),處理方式會(huì)比普通文字更復(fù)雜一些,但依舊可以借助 Apache POI 庫來完成,以下是詳細(xì)的處理思路和示例代碼,需要的朋友可以參考下
    2025-07-07
  • Java簡單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法

    Java簡單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法

    這篇文章主要介紹了Java簡單統(tǒng)計(jì)字符串中漢字,英文字母及數(shù)字?jǐn)?shù)量的方法,涉及java針對(duì)字符串的遍歷、編碼轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • SpringBoot入門教程詳解

    SpringBoot入門教程詳解

    SpringBoot?是由?Pivotal?團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來簡化?Spring?應(yīng)用的初始搭建以及開發(fā)過程。本文將詳細(xì)為大家講講SpringBoot是使用,需要的可以參考一下
    2022-06-06
  • Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件

    Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)郵件發(fā)送QQ郵箱帶附件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評(píng)論

双辽市| 天等县| 旬邑县| 南木林县| 南通市| 盐源县| 澳门| 淮北市| 松潘县| 广灵县| 响水县| 垫江县| 岚皋县| 娄烦县| 平定县| 峨山| 延川县| 石阡县| 垫江县| 普定县| 定安县| 贵溪市| 武川县| 和硕县| 三江| 阿坝| 荥经县| 霍山县| 澜沧| 利川市| 高要市| 长宁区| 盘锦市| 民乐县| 色达县| 南安市| 洪洞县| 德昌县| 邳州市| 越西县| 浮山县|