SpringBoot下关于SpringMVC拦截器的配置

本文详细介绍了如何在Spring MVC中配置XxxInterceptor,比较HandlerInterceptor与WebRequestInterceptor的异同,并展示了如何通过WebMvcConfigurationSupport和WebMvcConfigurer注册拦截器。讨论了两种方式的注册区别,以及路径匹配模式和classpath的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置spring mvc拦截器

编写拦截器

package sbt;

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

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

public class XxxInterceptor implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		//Controller方法调用之前调用
		System.out.println(">>>>>>>>>>>>>>>>>>>>preHandle");
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		//Controller方法调用之后调用
		System.out.println(">>>>>>>>>>>>>>>>>>>>postHandle");
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		//DispatcherServlet渲染对应的视图之后调用
		System.out.println(">>>>>>>>>>>>>>>>>>>>afterCompletion");
	}
}

HandlerInterceptor与WebRequestInterceptor的区别

拦截器的实现还有一种方式: WebRequestInterceptor, 这里说下他们的不同点, 具体的代码实现都差不多
WebRequestInterceptor 的 preHandle 没有返回值, 方法参数中没有response, 获取request更方便, 不影响后续流程, . 也就是说WebRequestInterceptor 更针对处理请求, 比如预设参数等.
HandlerInterceptor 的 preHandle 有返回值, 会影响到后续处理, 有response, 获取request相对会稍微多写点代码, 更注重业务处理, 比如12306可以判断是否售票时间内, 权限, 请求验签等等.
整体来说HandlerInterceptor的功能更强大, 但获取request相对代码会多点

使用WebMvcConfigurationSupport注册拦截器

@Component
public class WebMvcConfig extends WebMvcConfigurationSupport{
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		InterceptorRegistration registration = registry.addInterceptor(new XxxInterceptor());
	    registration.addPathPatterns("/**");//拦截
	    registration.excludePathPatterns("*.html");//不拦截
	}
}

使用WebMvcConfigurer注册拦截器

@Component
public class WebMvcConfig implements WebMvcConfigurer{
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		InterceptorRegistration registration = registry.addInterceptor(new XxxInterceptor());
	    registration.addPathPatterns("/**");//拦截
	    registration.excludePathPatterns("*.html");//不拦截
	}
}

WebMvcConfigurationSupport和WebMvcConfigurer的区别

注册拦截器时这两个没有任何区别,但设置别的mvc配置,可能会有区别,区别是当继承WebMvcConfigurationSupport时会覆盖原配置,而WebMvcConfigurer是自定义配置。

/*/**的区别

/* 是拦截所有的文件夹,不包含子文件夹
/** 是拦截所有的文件夹及里面的子文件夹

classpath和classpath*区别:

classpath:只会到WEB-INF\classes中查找文件。
classpath*:不仅包含WEB-INF\classes,还会到WEB-INF\lib下的每个jar的classpath进行查找。
注意: 用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,尽量避免使用classpath*。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值