目录
拦截器的定义以及作用
拦截器通常通过动态代理的方式来执行。
拦截器的生命周期由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中拦截器的请求路径书写必须为/**