SpringBoot统一功能处理-拦截器

本文介绍了SpringBoot中的拦截器概念,包括其作用、如何定义和实现HandlerInterceptor接口,以及如何在WebConfig中注册和配置拦截器,重点讲解了preHandle、postHandle和afterCompletion方法的执行顺序及拦截路径的设置。
摘要由CSDN通过智能技术生成

文章目录

目录

文章目录

前言

1. 拦截器

1.1 什么是拦截器?

1.2 拦截器的使用 

1.2.1 定义拦截器: 

1.2.2 注册配置拦截器:

1.2.3 拦截路径

1.2.4 拦截器执行流程


前言

大家好,今天给大家介绍一下SpringBoot的统一功能: 拦截器 


1. 拦截器

1.1 什么是拦截器?

拦截器是Spring框架提供的核心功能之一,主要⽤来拦截用户的请求, 在指定方法前后, 根据业务需要执行预先设定的代码

也就是说, 允许开发人员提前预定义一些逻辑, 在用户的请求响应前后执行. 也可以在用户

请求前阻止其执行

在拦截器当中,开发人员可以在应⽤程序中做⼀些通用性的操作, 比如通过拦截器来拦截前端发来的,判断Session中是否有 请求用户的信息. 如果有就可以放行, 如果没有就进行拦截

1.2 拦截器的使用 

拦截器的使用分为两步:

  • 定义拦截器
  • 注册配置拦截器

1.2.1 定义拦截器: 

实现HandlerInterceptor接口,并重写所有方法

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
 
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler) throws Exception {
 log.info("LoginInterceptor ⽬标⽅法执⾏前执⾏..");
 return true;
 }

 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse 
response, Object handler, ModelAndView modelAndView) throws Exception {
 log.info("LoginInterceptor ⽬标⽅法执⾏后执⾏");
 }

 @Override
public void afterCompletion(HttpServletRequest request, 
HttpServletResponse response, Object handler, Exception ex) throws Exception {
 log.info("LoginInterceptor 视图渲染完毕后执⾏,最后执⾏");
 }


}
  1. preHandle()方法:在请求处理之前被调用,可以用于进行一些前置处理逻辑,如果返回true,则继续执行后续操作;如果返回false,则中断请求。

  2. postHandle()方法:在请求处理之后、视图渲染之前被调用,可以用于进行一些后置处理逻辑。

  3. afterCompletion()方法:在整个请求完成之后被调用,可以用于进行一些资源清理操作。

1.2.2 注册配置拦截器:

实现WebMvcConfigurer接⼝,并重写addInterceptors方法

@Configuration
public class WebConfig implements WebMvcConfigurer {
 //⾃定义的拦截器对象
 @Autowired
 private LoginInterceptor loginInterceptor;
 @Override
 public void addInterceptors(InterceptorRegistry registry) {
 //注册⾃定义拦截器对象
 registry.addInterceptor(loginInterceptor)
 .addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表⽰拦截所
有请求)
 }
}

1.2.3 拦截路径

拦截路径是指我们定义的这个拦截器, 对哪些请求生效. 我们在注册配置拦截器的时候, 通过 addPathPatterns() 方法指定要拦截哪些请求. 也可以通过 excludePathPatterns() 指定不拦截哪些请求

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/admin/**"); // 只拦截以/admin开头的路径
    }
}

在拦截器中除了可以设置 /** 拦截所有资源外,还有⼀些常见拦截路径设置: 

拦截路径含义举例
/*⼀级路径能匹配/user,/book,/login,不能匹配 /user/login
/**任意级路径能匹配/user,/user/login,/user/reg /book
/* /book下的⼀级路径能匹配/book/addBook,不能匹配/book/addBook/1,/book /book
/** /book下的任意级路径能匹配/book,/book/addBook,/book/addBook/2,不能匹 配/user/login

1.2.4 拦截器执行流程

1. 添加拦截器后, 执行Controller的方法之前, 请求会先被拦截器拦截住. 执行 preHandle() 方法, 这个方法需要返回⼀个布尔类型的值. 如果返回true, 就表示放行本次操作, 继续访问controller中的 方法. 如果返回false,则不会放行(controller中的方法也不会执行).

2. controller当中的方法执行完毕后,再回过来执行 postHandle() 这个方法以及 afterCompletion() 方法,执行完毕之后,最终给浏览器响应数据. 


总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

拦截器类 需要两个配合使用这里只有一个 @Configuration public class ServletContextConfig extends WebMvcConfigurerAdapter { public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); registry.addResourceHandler("/templates/**").addResourceLocations("classpath:/templates/"); super.addResourceHandlers(registry); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerMyInterceptorAdapter()).addPathPatterns("/**") .excludePathPatterns("/") // .excludePathPatterns("/expressions/getExpressionsList") .excludePathPatterns("/loginInfo/getCordByIsPhone") .excludePathPatterns("/loginInfo/login11") //token失效跳轉 .excludePathPatterns("/loginInfo/insertLoginInfo") //注册 .excludePathPatterns("/loginInfo/login") //登录 .excludePathPatterns("/upload") //上传文件 .excludePathPatterns("/uploadListen") //上传文件 .excludePathPatterns("/admin/user/goLogin") //后台跳转登录 .excludePathPatterns("/admin/user/login") //后台登录 .excludePathPatterns("/loginInfo/getLoginInfo") //忘记密码 .excludePathPatterns("/loginInfo/getCord") //短信验证码 .excludePathPatterns("/loginInfo/getIsLoginInfo") //判断验证码&&登录 .excludePathPatterns("/loginInfo/getIsLoginInfo1") //判断验证码 .excludePathPatterns("/loginInfo/setPassWord") //设置密码 ; } @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } } @Component public class HandlerMyInterceptorAdapter implements HandlerInterceptor { @Autowired private HeartbeatServiceImpl heartbeatService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { String url = request.getRequestURI(); if (url.contains("admin")) { User user = (User) request.getSession().getAttribute("user"); try { if (user.equals(null)) { response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } else { return true; } }catch (Exception e){ response.sendRedirect(serverConfig.SERVER + "admin/user/goLogin"); return false; } }else { String token = request.getHeader("token"); if (token != null) { Jedis jedis = new Jedis(com.sevenSteps.util.RedisConfig.HOST, RedisConfig.PORT); String s = jedis.get(token); if(token.equals(s)) { heartbeatService = SpringUtil.getBean(HeartbeatServiceImpl.class); return heartbeatService.setOutDate(token); }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } }else { response.sendRedirect(serverConfig.SERVER + "loginInfo/login11"); return true; } } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃animal milk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值