Springboot 拦截器
1.什么是拦截器?
拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。
2.定义拦截器步骤
在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:
- 1.定义拦截器;
- 2.注册拦截器;
定义拦截器
在 Spring Boot中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口,重写以下三个方法。
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
private static final Pattern SHOULD_NOT_FILTER_URL_PATTERN;
static {
List<String> urlList = new ArrayList<>();
// 将不走拦截器的请求存放到Pattern
urlList.add("(socket/.*)");
urlList.add("(user/*)");
StringBuilder sb = new StringBuilder();
for (String url : urlList) {
sb.append(url);
sb.append("|");
}
sb.setLength(sb.length() - 1);
SHOULD_NOT_FILTER_URL_PATTERN = Pattern.compile(sb.toString());
}
/**
* 目标方法执行前 (Controller方法调用之前)
* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
* 返回 true 表示继续向下执行,返回 false 表示中断后续操作
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 获取访问的url
String servletPath = request.getServletPath();
// 排除特定请求
if (SHOULD_NOT_FILTER_URL_PATTERN.matcher(servletPath).find()) {
return true;
}
if (session.getAttribute("user") != null) {
// 可能有的项目在校验完session,还会校验token
String token = request.getHeader("access_token");
// 此处业务省略。。。
return true;
}
return false;
}
/**
* 目标方法执行后
* 该方法在控制器处理请求方法调用之后、解析视图之前执行
* 可以通过此方法对请求域中的模型和视图做进一步修改
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}", modelAndView);
}
/**
* 页面渲染后
* 该方法在视图渲染结束后执行
* 可以通过此方法实现资源清理、记录日志信息等工作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}", ex);
}
}
注册拦截器
创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,
并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Resource
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//可以多个拦截器
//InterceptorRegistration interceptorDemoRegistration = registry.addInterceptor(new InterceptorDemo());
//interceptorDemoRegistration.addPathPatterns("/..");
//interceptorDemoRegistration.addPathPatterns("/..");
//注册自己的拦截器,并设置拦截的请求路径
//addPathPatterns为拦截此请求路径的请求
//excludePathPatterns为不拦截此路径的请求
registry.addInterceptor(loginInterceptor)
//可以设置多个路径拦截
.addPathPatterns("/admin/*")
.excludePathPatterns("/admin/oldLogin");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/197552.html