拦截器和过滤器有点相似,但又有不同。
1.拦截器是属于框架Spring MVC ,过滤器是基于serlvet。
拦截器:
过滤器:
2.处理时机:
过滤器执行在前,拦截器执行在后,拦截器是针对于controller。
3.实现方式不同:过滤器是基于函数回调,拦截器是基于代理模式。
Springboot实现拦截器如下:
实现interceptor接口,实现拦截器接口方法:
- preHandle:请求进入controller之前
- postHandle:请求离开controller之后
- afterCompletion:视图渲染完成后
我们的业务一般只需要实现 preHandle()这个方法就行:
package com.zxy.loglearn.config.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @USER: zhouxy
* @DATE: 2019/12/26 14:32
* 创建拦截器,需要实现 HandlerInterceptor 接口
* 主要实现 preHandle ,必须要保证返回true , 才能保证继续执行下面的流程
**/
@Slf4j
public class InterceptorConfig implements HandlerInterceptor {
/**
* 请求进入controller之前
* @param response
* @param handler
* @return
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
log.info("enter interceptor $.$ $.$ $.$ $.$ $.$ $.$ $.$");
return true;
}
/**
* 请求离开controller
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable ModelAndView modelAndView) throws Exception {
log.info("wait interceptor -.- -.- -.- -.- -.- -.- -.- -.- -.- -.- -.-");
}
/**
* 视图渲染完成后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable Exception ex) throws Exception {
log.info("leave interceptor @.@ @.@ @.@ @.@@.@@.@ @.@ @.@ @.@ @.@");
}
}
向Spring Mvc注册拦截器:
package com.zxy.loglearn.config;
import com.zxy.loglearn.config.interceptor.InterceptorConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @USER: zhouxy
* @DATE: 2019/12/26 17:40
* 拦截器属于MVC框架,基于动态代理,aop的一种实现
**/
@Configuration
public class InterceptorConfigure implements WebMvcConfigurer {
/**
* 添加拦截器 可以添加多个
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new InterceptorConfig()).addPathPatterns("/**");
}
}
拦截器也跟过滤器一样,根据业务不同的需要添加多个拦截器。
来源:CSDN
作者:花小周
链接:https://blog.csdn.net/yu13843271857/article/details/103754695