- Spring Boot 拦截器是 AOP 的一种实现
- 专门拦截对Controller控制层的请求
- 主要应用于判断用户权限,异常处理等
创建拦截器
- 类只要实现
HandlerInterceptor
接口,即可成为拦截器类,其中有以下三个主要方法
方法 | 返回值 | 说明 |
---|---|---|
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | boolean | 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true表示继续向下执行,返回 false 表示中断后续操作。 |
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) | void | 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。 |
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) | void | 该方法在视图渲染结束后执行,可以通过此方法实现资源清理,记录日志信息等工作 |
eg:
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author: solo
* @date: 2023-01-31
* @version: V1.0
* @description: 创建自定义拦截器
*/
public class MyInterceptor implements HandlerInterceptor {
/**
* 访问控制器方法前执行
* @author solo
* @date 2023-01-31 9:41
* @param request
* @param response
* @param handler
* @return boolean
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle:" + request.getRequestURL());
return true;
}
/**
* 访问控制器方法后执行
* @author solo
* @date 2023-01-31 9:40
* @param request
* @param response
* @param handler
* @param modelAndView
* @return void
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle:" + request.getRequestURL());
}
/**
* postHandle方法执行完成后执行,一般用于释放资源和日志处理
* @author solo
* @date 2023-01-31 9:40
* @param request
* @param response
* @param handler
* @param ex
* @return void
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion:" + request.getRequestURL());
}
}
MyInterceptor 中的方法执行顺序为 preHandle -> Controller层方法 –> postHandle –> afterCompletion ,所以拦截器实际上可以对 Controller 方法执行前后进行拦截监控和异常处理
配置拦截器
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author: solo
* @date: 2023-01-31
* @version: V1.0
* @description:
*/
public class MyInterceptorConfig implements WebMvcConfigurer {
/**
* 添加拦截器
* @author solo
* @date 2023-01-31 9:48
* @param registry
* @return void
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截,放行登录页,登陆操作,静态资源等
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/", "/login", "/css/**", "/img/**", "/js/**");
}
}
- addPathPatterns方法用于指定拦截路径,
/**
代表拦截所有路径 - excludePathPatterns方法用于排除拦截路径,指定不需要被拦截器拦截的请求
© 版权声明
非商业转载或引用请标注本文链接,商业转载或引用请联系站长
部分文章内容可能来自互联网,如有侵权,请通过邮件联系
部分文章内容可能来自互联网,如有侵权,请通过邮件联系
THE END
暂无评论内容