拦截器实现对每一个请求处理前后进行相关的业务处理,类似于Servlet的Filter,可以让Bean 实现HanlderIntercepter接口或者继承HandlerIntercepteorAdapter 类来实现自定义拦截器
- AppPermissionInterceptor 拦截器
@Component
@Slf4j
@PropertySource("classpath:application.properties")
public class AppPermissionInterceptor implements HandlerInterceptor {
@Autowired
AppInfoMapping appInfoMapping;
@Autowired
UserAppService userAppService;
@Value("${citydo.appno}")
String appNo;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
String relativePath = request.getRequestURI();
if(relativePath.contains("/safe/file")){
return true;
}
String timestamp = null,nonce = null,API_KEY = null,signature = null;
timestamp = request.getHeader("timestamp");
nonce = request.getHeader("nonce");
API_KEY = request.getHeader("API_KEY");
signature = request.getHeader("signature");
AppInfo info = new AppInfo();
info.setAppNo(appNo);
info.setApiKey(API_KEY);
AppInfo appInfo = appInfoMapping.findAppInfoByAppNo(info);
if(appInfo == null){
returnErrorMessage(response,new ResultPac(-1,"无此App产品,或产品已下架!"));
return false;
}
int authEnable = appInfo.getAuthEnable();
if(authEnable == 1){//认证开启
log.info("接口访问认证拦截器开启!");
ResultPac authPassResult = userAppService.authentication(timestamp,nonce,API_KEY,signature);
if(authPassResult.getCode() == 0){
log.info("接口访问认证拦截器验证通过!");
return true;
}else{
log.error("接口访问认证拦截器验证失败!");
returnErrorMessage(response,authPassResult);
return false;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
private void returnErrorMessage(HttpServletResponse response, ResultPac errorMessage) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
//Get the printwriter object from response to write the required json object to the output stream
PrintWriter out = response.getWriter();
String jsonOfRST = JSONObject.toJSONString(errorMessage);
out.print(jsonOfRST);
out.flush();
}
}
- 2.ExecuteTimeInterceptorl拦截器
@Component
public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(ExecuteTimeInterceptor.class);
//before the actual handler will be executed
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
long startTime = System.currentTimeMillis();
request.setAttribute("startTime", startTime);
return true;
}
//after the handler is executed
@Override
public void postHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView
) {
long startTime = (Long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
long executeTime = endTime - startTime;
//log it
logger.warn("[" + handler + "] executeTime : " + executeTime + "ms");
}
}
Springboot 配置扫描自定义拦截器:
@SpringBootConfiguration
public class MySpringMVCConfig extends WebMvcConfigurerAdapter{
@Autowired
private AppPermissionInterceptor appPermissionInterceptor;
@Autowired
private ApplicationContext applicationContext;
//重写addInterceptors 方法,注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry){
//注册appPermissionInterceptor拦截器
registry.addInterceptor(appPermissionInterceptor).addPathPatterns("/**");
//注册ExecuteTimeInterceptor拦截器
registry.addInterceptor(applicationContext.getBean(ExecuteTimeInterceptor.class)).addPathPatterns("/**");
}
//文件路径映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pic/**")
.addResourceLocations("file:/var/ftp/fileServer/")
.addResourceLocations("file:/var/ftp/fileServer/icon/")
.addResourceLocations("file:/var/ftp/fileServer/function/2x/")
.addResourceLocations("file:/var/ftp/fileServer/function/3x/");
registry.addResourceHandler("/pic2/**").addResourceLocations("file:/var/ftp/fileServer2/");
//registry.addResourceHandler("/icon/**").addResourceLocations("file:/var/ftp/fileServer/icon/");
super.addResourceHandlers(registry);
}
@Bean
public FilterRegistrationBean wrapperFilterRegistrationBean() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(applicationContext.getBean(WrapperFilter.class));
registration.addUrlPatterns("/*");
registration.setName("wrapperFilter");
registration.setOrder(1);
return registration;
}
@Bean
public FilterRegistrationBean encodeFilterRegistrationBean() {
FilterRegistrationBean registration = new FilterRegistrationBean();
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
registration.setFilter(characterEncodingFilter);
registration.addUrlPatterns("/*");
registration.setName("encodeFilter");
registration.setOrder(1);
return registration;
}
@Bean
public FilterRegistrationBean loggingFilterRegistrationBean() {
FilterRegistrationBean registration = new FilterRegistrationBean();
LoggingFilter loggingFilter = new LoggingFilter();
registration.setFilter(loggingFilter);
registration.addUrlPatterns("/*");
registration.setName("loggingFilter");
registration.setOrder(3);
return registration;
}
}