亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringMVC攔截器失效問(wèn)題及解決方法

 更新時(shí)間:2024年01月06日 14:55:08   作者:哥的時(shí)代  
這篇文章主要介紹了SpringMVC?攔截器和異常處理器,以及SpringMVC攔截器失效分析解決方案,文中補(bǔ)充介紹了SpringMVC?攔截器和異常處理器的相關(guān)知識(shí),需要的朋友可以參考下

SpringMVC攔截器失效

項(xiàng)目場(chǎng)景:

項(xiàng)目(springmvc)中新寫(xiě)了些攔截器沒(méi)生效,記錄一下原因

問(wèn)題描述:

使用的xml的方式配置攔截器,具體如下

1.首先新建一個(gè)類實(shí)現(xiàn)HandlerInterceptor

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String sre = ".....";
        return false;
    }
    @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 {
    }
}

2.接著在xml中注冊(cè)攔截器

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/apiweb/**"/>
            <bean class="com.xxx.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

好像沒(méi)什么大問(wèn)題,實(shí)現(xiàn) HandlerInterceptor接口,再將對(duì)應(yīng)的類注冊(cè)到容器中
但是,細(xì)節(jié)上存在很多問(wèn)題,導(dǎo)致目前的配置中攔截器不生效

原因分析:

debug時(shí)發(fā)現(xiàn)根本就沒(méi)有在容器中注冊(cè)新寫(xiě)的攔截類,首先要做的是看看為什么沒(méi)有注冊(cè)成功后;之后再debug時(shí)返現(xiàn)url攔截路徑不對(duì),又修改了攔截路徑??偣彩?strong>兩個(gè)問(wèn)題,一個(gè)一個(gè)分析

在xml中配置<mvc:annotation-driven/>,從網(wǎng)上的信息看,這段代碼會(huì)注冊(cè)HandlerMapping和HandlerAdapter,在官方的解釋中,有著更明確的回答

簡(jiǎn)單總結(jié)一下的話,添加了<mvc:annotation-driven/>后,就會(huì)自動(dòng)注冊(cè)自定義的HandlerInterceptors ,不再需要手動(dòng)添加

debug一下

當(dāng)不寫(xiě)<mvc:annotation-driven/>時(shí),進(jìn)行請(qǐng)求,在AbstractHandlerMapping類中

     容器中mappedInterceptors的個(gè)數(shù)為0

當(dāng)使用<mvc:annotation-driven/>

容器中mappedInterceptors個(gè)數(shù)變成了2個(gè),包含自定義的LoginInterceptor(圖片中沒(méi)顯示出來(lái)。。。). 攔截器注冊(cè)后,剩下攔截路徑的配置
最初的攔截路徑為

<mvc:mapping path="/apiweb/**"/>

這樣寫(xiě)的原因是web.xml中的DispatcherServlet攔截的路徑為/apiweb/**,以為攔截器這么寫(xiě)也沒(méi)問(wèn)題,但實(shí)際上路徑錯(cuò)誤導(dǎo)致攔截失敗,debug發(fā)現(xiàn),當(dāng)輸入的地址為http://localhost:8004/apiweb/test/a

lookupPath是/test/a,而攔截路徑卻是/apiweb/**,并不匹配,所以攔截路徑也要進(jìn)行修改,目前而言,改成/**即可

解決方案:

要修改的地方有兩處:

  • 在xml配置文件中添加<mvc:annotation-driven/>
  • 將攔截器的攔截路徑修改為/**

ps:如果使用注解配置的話,只需要添加一個(gè)類并繼承WebMvcConfigurationSupport類,然后重寫(xiě)addInterceptors方法。如下

@Configuration
public class WebCon extends WebMvcConfigurationSupport {
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new LoginInterceptor())
               .addPathPatterns("/**");
   }
}

看上去比xml配置簡(jiǎn)單很多,也不用操心<mvc:annotation-driven/>

補(bǔ)充:

SpringMVC 攔截器和異常處理器

一、攔截器

1、攔截器的配置

SpringMVC中的攔截器用于攔截控制器方法的執(zhí)行

SpringMVC中的攔截器需要實(shí)現(xiàn)HandlerInterceptor

SpringMVC的攔截器必須在SpringMVC的配置文件中進(jìn)行配置:

<bean class="com.gedeshidai.interceptor.FirstInterceptor"></bean>
<ref bean="firstInterceptor"></ref>
<!-- 以上兩種配置方式都是對(duì)DispatcherServlet所處理的所有的請(qǐng)求進(jìn)行攔截 -->
<mvc:interceptor>
    <mvc:mapping path="/**"/>
    <mvc:exclude-mapping path="/testRequestEntity"/>
    <ref bean="firstInterceptor"></ref>
</mvc:interceptor>
<!-- 
	以上配置方式可以通過(guò)ref或bean標(biāo)簽設(shè)置攔截器,通過(guò)mvc:mapping設(shè)置需要攔截的請(qǐng)求,通過(guò)mvc:exclude-mapping設(shè)置需要排除的請(qǐng)求,即不需要攔截的請(qǐng)求
-->

2、攔截器的三個(gè)抽象方法

SpringMVC中的攔截器有三個(gè)抽象方法:

preHandle:控制器方法執(zhí)行之前執(zhí)行preHandle(),其boolean類型的返回值表示是否攔截或放行,返回true為放行,即調(diào)用控制器方法;返回false表示攔截,即不調(diào)用控制器方法

postHandle:控制器方法執(zhí)行之后執(zhí)行postHandle()

afterComplation:處理完視圖和模型數(shù)據(jù),渲染視圖完畢之后執(zhí)行afterComplation()

3、多個(gè)攔截器的執(zhí)行順序

a>若每個(gè)攔截器的preHandle()都返回true

此時(shí)多個(gè)攔截器的執(zhí)行順序和攔截器在SpringMVC的配置文件的配置順序有關(guān):

preHandle()會(huì)按照配置的順序執(zhí)行,而postHandle()和afterComplation()會(huì)按照配置的反序執(zhí)行

b>若某個(gè)攔截器的preHandle()返回了false

preHandle()返回false和它之前的攔截器的preHandle()都會(huì)執(zhí)行,postHandle()都不執(zhí)行,返回false的攔截器之前的攔截器的afterComplation()會(huì)執(zhí)行

二、異常處理器

1、基于配置的異常處理

SpringMVC提供了一個(gè)處理控制器方法執(zhí)行過(guò)程中所出現(xiàn)的異常的接口:HandlerExceptionResolver

HandlerExceptionResolver接口的實(shí)現(xiàn)類有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver

SpringMVC提供了自定義的異常處理器SimpleMappingExceptionResolver,使用方式:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
        	<!--
        		properties的鍵表示處理器方法執(zhí)行過(guò)程中出現(xiàn)的異常
        		properties的值表示若出現(xiàn)指定異常時(shí),設(shè)置一個(gè)新的視圖名稱,跳轉(zhuǎn)到指定頁(yè)面
        	-->
            <prop key="java.lang.ArithmeticException">error</prop>
        </props>
    </property>
    <!--
    	exceptionAttribute屬性設(shè)置一個(gè)屬性名,將出現(xiàn)的異常信息在請(qǐng)求域中進(jìn)行共享
    -->
    <property name="exceptionAttribute" value="ex"></property>
</bean>

2、基于注解的異常處理

//@ControllerAdvice將當(dāng)前類標(biāo)識(shí)為異常處理的組件
@ControllerAdvice
public class ExceptionController {
    //@ExceptionHandler用于設(shè)置所標(biāo)識(shí)方法處理的異常
    @ExceptionHandler(ArithmeticException.class)
    //ex表示當(dāng)前請(qǐng)求處理中出現(xiàn)的異常對(duì)象
    public String handleArithmeticException(Exception ex, Model model){
        model.addAttribute("ex", ex);
        return "error";
    }
}

總結(jié)

以上就是SpringMVC之?dāng)r截器和異常處理器的相關(guān)知識(shí)點(diǎn),希望對(duì)你有所幫助。

到此這篇關(guān)于SpringMVC 攔截器和異常處理器的文章就介紹到這了,更多相關(guān)SpringMVC 攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用eclipse + maven一步步搭建SSM框架教程詳解

    使用eclipse + maven一步步搭建SSM框架教程詳解

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三個(gè)開(kāi)源框架整合而成,常作為數(shù)據(jù)源較簡(jiǎn)單的web項(xiàng)目的框架.這篇文章主要介紹了eclipse + maven搭建SSM框架 ,需要的朋友可以參考下
    2017-11-11
  • Java基于Swing實(shí)現(xiàn)的打獵射擊游戲代碼

    Java基于Swing實(shí)現(xiàn)的打獵射擊游戲代碼

    這篇文章主要介紹了Java基于Swing實(shí)現(xiàn)的打獵射擊游戲代碼,包含完整的游戲事件處理與邏輯流程控制,具有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • JAVA設(shè)計(jì)模式中的策略模式你了解嗎

    JAVA設(shè)計(jì)模式中的策略模式你了解嗎

    這篇文章主要為大家詳細(xì)介紹了JAVA設(shè)計(jì)模式中的策略模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 利用Spring Session和redis對(duì)Session進(jìn)行共享詳解

    利用Spring Session和redis對(duì)Session進(jìn)行共享詳解

    這篇文章主要給大家介紹了關(guān)于利用Spring、Session和redis對(duì)Session進(jìn)行共享的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • Spring中的代理ProxyFactory解析

    Spring中的代理ProxyFactory解析

    這篇文章主要介紹了Spring中的ProxyFactory解析,在Java中,代理模式的實(shí)現(xiàn)通常依靠Proxy類和InvocationHandler接口,本文將介紹如何使用ProxyFactory來(lái)創(chuàng)建代理模式,需要的朋友可以參考下
    2023-12-12
  • spring boot整合hessian的示例

    spring boot整合hessian的示例

    本文通過(guò)實(shí)例代碼給大家介紹了spring boot整合hessian的方法,需要的朋友可以參考下
    2017-07-07
  • 淺談基于Token的WEB后臺(tái)認(rèn)證機(jī)制

    淺談基于Token的WEB后臺(tái)認(rèn)證機(jī)制

    這篇文章主要介紹了淺談基于Token的WEB后臺(tái)認(rèn)證機(jī)制,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Springboot集成Camunda使用Mysql介紹

    Springboot集成Camunda使用Mysql介紹

    大家好,本篇文章主要講的是Springboot集成Camunda使用Mysql介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java整合騰訊云短信發(fā)送實(shí)例代碼

    Java整合騰訊云短信發(fā)送實(shí)例代碼

    大家好,本篇文章主要講的是Java整合騰訊云短信發(fā)送實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 解讀maven配置阿里云鏡像問(wèn)題

    解讀maven配置阿里云鏡像問(wèn)題

    這篇文章主要介紹了解讀maven配置阿里云鏡像問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評(píng)論