SpringMVC拦截器的配置及其细节

1.拦截器的三个方法:

preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true)
postHandle():在控制器方法执行之后执行
afterCompletion():在控制器方法执行之后,且渲染视图完毕后执行

2.多个拦截器的执行顺序 和在SpringMVC的配置文件中配置的顺序有关

preHandle()按照配置的顺序执行,而postHandle()和afterCompletion()按照配置的反序执行

3.若拦截器中有某个拦截器的preHandle()返回了false

拦截器的preHandle()返回false和它之前的拦截器的preHandle()都会执行
所有的拦截器的postHandle()都不执行
拦截器的preHandle()返回false之前的拦截器的afterCompletion()会执行

以下是具体的配置:
需要注意的是SpringMVC中的拦截器需要实现HandlerInterceptor,SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 自动扫描包 -->
    <context:component-scan base-package="com.qcw"/>

    <!-- 配置Thymeleaf视图解析器 -->
    <bean id="viewResolver"
          class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean
                            class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

    <!--
        配置默认的servlet处理静态资源
        -当前工程的web.xml配置的前端控制器DispatcherServlet的url-pattern是/
         tomcat的web.xml配置的默认的DefaultServlet的url-pattern也是/
         此时,浏览器发送的请求会优先被DispatcherServlet进行处理,但是DispatcherServlet无法处理静态资源
         若配置了<mvc:default-servlet-handler/>标签,此时浏览器的所有请求都会被DefaultServlet处理
         若配置了<mvc:default-servlet-handler/>和<mvc:annotation-driven/>
         浏览器发送的请求会先被DispatcherServlet处理,若无法处理再交给DefaultServlet处理
    -->
    <mvc:default-servlet-handler/>

    <!--开启mvc的注解驱动-->
    <mvc:annotation-driven/>
    <!--配置视图控制器-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>

    <!--配置文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>


    <mvc:interceptors>
        <!--
            bean和ref标签所配置的拦截器默认对DispatcherServlet处理的所有请求进行拦截
            mvc:interceptor配置更加的精确
        -->
        <!--<bean class="com.qcw.interceptor.FirstInterceptor"/>-->
        <ref bean="firstInterceptor"></ref>
        <ref bean="secondInterceptor"></ref>
        <!--<mvc:interceptor>-->
        <!--    &lt;!&ndash;配置需要拦截的请求得请求路径(这里比较特殊),/**表示所有得请求,而/*只表示一层目录的&ndash;&gt;-->
        <!--    <mvc:mapping path="/**"/>-->
        <!--    &lt;!&ndash;配置需要排除拦截的请求的请求路径&ndash;&gt;-->
        <!--    <mvc:exclude-mapping path="/abc"/>-->
        <!--    &lt;!&ndash;配置拦截器&ndash;&gt;-->
        <!--    <ref bean="firstInterceptor"></ref>-->
        <!--</mvc:interceptor>-->
    </mvc:interceptors>
</beans>
package com.qcw.interceptor;
/**
 * @author wqc
 * @date 2022/10/3 15:02
 * Description:
 *  拦截器的三个方法:
 *   preHandle():在控制器方法执行之前执行,其返回值表示对控制器方法的拦截(false)或放行(true)
 *   postHandle():在控制器方法执行之后执行
 *   afterCompletion():在控制器方法执行之后,且渲染视图完毕后执行
 *
 *  多个拦截器的执行顺序 和在SpringMVC的配置文件中配置的顺序有关
 *   preHandle()按照配置的顺序执行,而postHandle()和afterCompletion()按照配置的反序执行
 *
 *  若拦截器中有某个拦截器的preHandle()返回了false
 *   拦截器的preHandle()返回false和它之前的拦截器的preHandle()都会执行
 *   所有的拦截器的postHandle()都不执行
 *   拦截器的preHandle()返回false之前的拦截器的afterCompletion()会执行
 */

@Component
public class FirstInterceptor implements HandlerInterceptor {
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("FirstInterceptor-->preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("FirstInterceptor-->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("FirstInterceptor-->afterCompletion");
    }
}
package com.qcw.interceptor;
/**
 * @author wqc
 * @date 2022/10/3 18:45
 * Description:
 */

@Component
public class SecondInterceptor implements HandlerInterceptor {
    
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        System.out.println("SecondInterceptor-->preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        System.out.println("SecondInterceptor-->postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        System.out.println("SecondInterceptor-->afterCompletion");
    }
}

猜你喜欢

转载自blog.csdn.net/qq_47637405/article/details/127157479