Spring MVC:拦截器(Interceptor)的定义和配置

1、SpringMVC中组件: 拦截器(Interceptor)

拦截器Interceptor)对我们来说是非常实用的,也是经常使用的,可以在所有的HandlerMapping的前后进行拦截,当我们需要将特定功能应用于符合某种规则的请求的时候,这个时候就可以使用拦截器。

我们自定义的拦截器必须继承org.springframework.web.servlet.HandlerInterceptor,在HandlerInterceptor由三个默认方法

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;
import org.springframework.web.method.HandlerMethod;

public interface HandlerInterceptor {
    
    
	/**
	* 在执行实际储器程序之前,根据返回的boolen判断是否放行
	*/
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
    
    

		return true;
	}
	/**
	* 执行处理程序之后
	*/
	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
    
    
	}
	/**
	* 在完成请求后
	*/
	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
    
    
	}

}

自定义的拦截器:

package com.example.web.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    
    

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
    
        String requestURI = request.getRequestURI();
        System.out.println("请求的路径:" +requestURI);
        long startTime = System.currentTimeMillis();
        request.setAttribute("request::start",startTime);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
    
        long startTime = (long)request.getAttribute("request::start");
        long processEndTime = System.currentTimeMillis();
        System.out.println("处理程序执行完成耗时:"+ (processEndTime-startTime) + "毫秒");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
    
        long startTime = (long)request.getAttribute("request::start");
        long endTime = System.currentTimeMillis();
        System.out.println("从请求到完成响应耗时:"+ (endTime-startTime) + "毫秒");
    }
}

2、拦截器(Interceptor)的配置

在自定拦截器完成后,就是在Spring MVC 中配置我们的拦截器(Interceptor)了,可以通过Java配置类的方式进行配置,也可以通过xml文件的方式进行配置。

先从Java配置类的方式来看:

  • @EnableWebMvc : 表示启用Spring MVC的功能
  • @Configuration: 表示该类是Spring 中的配置类
  • 拦截的配置需要重写WebMvcConfigureraddInterceptors(InterceptorRegistry registry) 方法,通过registry进行添加(默认拦截所有)
  • 可以通过addPathPatterns来表示拦截哪些请求
  • 可以通过excludePathPatterns不拦截哪些请求

对于URI匹配模式:

  • :匹配一个字符
  • * :匹配路径段中的零个或者多个字符
  • **:匹配零个或者多个路径段
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    
    

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
    
    	registry.addInterceptor(new MyInterceptor())
        registry.addInterceptor(new LocaleChangeInterceptor());
        registry.addInterceptor(new ThemeChangeInterceptor()).addPathPatterns("/**").excludePathPatterns("/admin/**");
        registry.addInterceptor(new SecurityInterceptor()).addPathPatterns("/secure/*");
    }
}

在xml中进行配置:

<mvc:interceptors>
	<bean class="com.example.web.interceptor.MyInterceptor"/>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/admin/**"/>
        <bean class="org.springframework.web.servlet.theme.ThemeChangeInterceptor"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/secure/*"/>
        <bean class="org.example.SecurityInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

猜你喜欢

转载自blog.csdn.net/Hicodden/article/details/111464228