SpringBoot自定义拦截器

目录

拦截器的定义以及作用

自定义拦截器

配置拦截器


拦截器的定义以及作用

拦截器通常通过动态代理的方式来执行。

拦截器的生命周期由IoC容器管理,可以通过注入等方式来获取其他Bean的实例,使用更方便。

拦截器的作用类似于Servlet 中的Filter,都可以用于对处理器进行预处理和后处理。在Spring MVC 与Spring Boot 中使用拦截器一般是实现HandlerInterceptor 接口。

将多个Controller中共有的代码放在拦截器中执行,从而减少controller中代码的冗余。

自定义拦截器

首先我们得明确拦截器得作用,以及在一些特定得业务场景下得使用,这里拿一种场景来举例,如需要对整个项目得请求做统一得拦截处理,对其某些特定得请求做特殊处理等,这个时候就需要做拦截器来处理这些问题。那么我们需要先自定义一个拦截器如下:

package com.pig4cloud.pigx.wonders.common.conf;

import com.pig4cloud.pigx.common.core.exception.InterceptorException;
import com.pig4cloud.pigx.wonders.index.entity.TYdzfAppInfo;
import com.pig4cloud.pigx.wonders.index.mapper.TYdzfAppInfoMapper;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/**统一自定义拦截器
 * @author tonganzhou
 * @version 1.0
 * @date 2021/7/26 9:01
 */
public class RequestInterceptor implements HandlerInterceptor {

	@Autowired
	TYdzfAppInfoMapper tYdzfAppInfoMapper;

	/**
	 * Controller方法处理之前调用此方法
	 * 链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
	 * 若返回false,则中断执行,注意:不会进入afterCompletion
	 * @param request
	 * @param response
	 * @param handler
	 * @return
	 * @throws Exception
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
		// 增加拦截逻辑 查询head头是否带version版本号
		String version=request.getHeader("version");
		if (StringUtils.isEmpty(version)){
				throw new InterceptorException("当前不是最新版本,请更新最新版本后再操作");
		}else{
			TYdzfAppInfo tYdzfAppInfo=tYdzfAppInfoMapper.getAppInfo();
			if (!"PC".equals(version)&&Integer.parseInt(version)<Integer.parseInt(tYdzfAppInfo.getAppCode())){
				throw new InterceptorException("当前不是最新版本,请更新最新版本后再操作");
			}
		}
		return true;
	}

	/**
	 * 	preHandle返回true时才调用此方法
	 * @param request
	 * @param response
	 * @param handler
	 * @param modelAndView
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
	}

	/**
	 * preHandle返回true时才调用此方法
	 * @param request
	 * @param response
	 * @param handler
	 * @param ex
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
	}
}

需要明确得是定义一个拦截器一定要知道拦截器实现得这三个比较重要得方法得执行顺序,然后根据需要分别做逻辑处理来达到你想要的目的。

配置拦截器

配置拦截器是将我们的自定义拦截器通过配置工具来实例注册,同时还可以配置当前拦截器的一个作用范围等。继承WebMvcConfigurerAdapter 接口,重写其中的addInterceptors() 方法。调用registry.addInterceptor() 方法注册该拦截器。

package com.pig4cloud.pigx.wonders.common.conf;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 统一拦截器配置注册自定义拦截器
 * @author tonganzhou
 * @version 1.0
 * @date 2021/7/26 9:00
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Bean
	public RequestInterceptor interceptorRequest () {
		return new RequestInterceptor();
	}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {

		InterceptorRegistration registration = registry.addInterceptor(interceptorRequest());//指定拦截器实例
		registration.addPathPatterns("/**");//用来指定那些请求
		registration.excludePathPatterns(
				"/appInfo/getAppInfo"
		);//用来排除那些请求
	}

}

注意:在springboot中拦截器的请求路径书写必须为/**

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值