簡(jiǎn)介
攔截器是基于web框架的調(diào)用,因此可以使用Spring的依賴注入(DI)進(jìn)行一些業(yè)務(wù)操作。在SpringMVC中就是依賴于SpringMVC框架。在實(shí)現(xiàn)上基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用。
主要工作場(chǎng)景
攔截器可以獲取IOC容器中的各個(gè)bean,而過濾器就不行,所以在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯。
攔截器只能對(duì)controller請(qǐng)求進(jìn)行攔截,對(duì)其他的一些比如直接訪問靜態(tài)資源的請(qǐng)求則沒辦法進(jìn)行攔截處理。
WebMvcConfigurerAdapter 比較常用的重寫接口
/** 添加類型轉(zhuǎn)換器和格式化器 */ public void addFormatters(FormatterRegistry registry) /**
解決跨域問題 **/ public void addCorsMappings(CorsRegistry registry) ; /** 配置消息轉(zhuǎn)換器 */
public void configureMessageConverters(List<HttpMessageConverter<?>>
converters) /** 添加攔截器 **/ void addInterceptors(InterceptorRegistry registry);
/** 這里配置視圖解析器 **/ void configureViewResolvers(ViewResolverRegistry registry);
/** 配置內(nèi)容裁決的一些選項(xiàng) **/ void
configureContentNegotiation(ContentNegotiationConfigurer configurer); /**
視圖跳轉(zhuǎn)控制器 **/ void addViewControllers(ViewControllerRegistry registry); /**
靜態(tài)資源處理 **/ void addResourceHandlers(ResourceHandlerRegistry registry); /**
默認(rèn)靜態(tài)資源處理器 **/ void
configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
#添加攔截器
@Override public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ReqInterceptor()).addPathPatterns("/**"); }
實(shí)現(xiàn)自定義攔截器
public class ReqInterceptor extends HandlerInterceptorAdapter { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
System.out.println("攔截器--preHandle"); return super.preHandle(request, response,
handler); } @Override public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler, ModelAndView modelAndView) throws
Exception { System.out.println("攔截器--postHandle"); super.postHandle(request,
response, handler, modelAndView); } @Override public void
afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("攔截器--afterCompletion"); super.afterCompletion(request,
response, handler, ex); } @Override public void
afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
System.out.println("攔截器--afterConcurrentHandlingStarted");
super.afterConcurrentHandlingStarted(request, response, handler); } }
測(cè)試用例
@GetMapping("/filter/{id}") public void filter(@PathVariable("id") Long id) {
System.out.println("Controller方法--前"); UserEntity userEntity =
userService.findUserById(id); System.out.println("Controller方法--后"); }
運(yùn)行結(jié)果
熱門工具 換一換