1. 自定義攔截器
Spring-boot中的攔截器通過實(shí)現(xiàn)HandlerInerceptor中的方法來定義,其中包含三個(gè)方法:
preHandle:請(qǐng)求執(zhí)行前執(zhí)行
postHandle:請(qǐng)求結(jié)束執(zhí)行
afterCompletion:視圖渲染完成后執(zhí)行
創(chuàng)建自定義攔截器類TestInterceptor.java
TestInterceptor.java
package com.seasky.servicesitespring.interceptor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestInterceptor implements HandlerInterceptor {
private static final Logger logger = LogManager.getLogger();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//這里在請(qǐng)求執(zhí)行前獲取token
String token = request.getHeader("Authorization");
logger.info("TestInterceptor preHandle token: " + token);
if(token == null || token.isEmpty()) {
return false;//返回false表示被攔截,后續(xù)請(qǐng)求不在執(zhí)行
}
return true;//返回true表示通過,繼續(xù)執(zhí)行后續(xù)攔截器,如果是最后一個(gè)攔截器,則執(zhí)行controller
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("TestInterceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("TestInterceptor afterCompletion");
}
}
2. 注冊(cè)攔截器
Spring-boot中通過實(shí)現(xiàn)接口WebMvcConfigurer中的addInterceptors方法注冊(cè)自定義的攔截器。
需要注意不要使用WebMvcConfigurerAdapter,該方法已經(jīng)被官方標(biāo)注過時(shí)。
創(chuàng)建攔截器注冊(cè)類InterceptorConfig.java
InterceptorConfig.java
package com.seasky.servicesitespring.config;
import com.seasky.servicesitespring.interceptor.TestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//使用Configuration注解,使spring-boot啟動(dòng)時(shí)可以自動(dòng)掃描
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/**
* 注冊(cè)攔截器方法
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加自定義的攔截器,并設(shè)置攔截路徑規(guī)則
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
}
}
之后運(yùn)行程序,調(diào)用controller時(shí)會(huì)發(fā)現(xiàn)攔截器已經(jīng)生效,命令行中可以看到日志輸出。