本文共 3383 字,大约阅读时间需要 11 分钟。
拦截器是一种切面思想,spring框架中实现了这种思想,提供了拦截器技术的相关接口,常用于日志拦截,登录判断等泛化流程处理中,可结合注解细化拦截范围。
在03-springboot-web中创建interceptor包,并创建一个LoginInterceptor拦截器
代码示例:
package com.bjpowernode.springboot.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor { @Override //进入Controller之前执行该方法 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //登录拦截的业务逻辑 System.out.println("-------登录请求拦截器--------------"); System.out.println(request.getRequestURI().toString()); Object object = request.getSession().getAttribute("user"); if (object == null) { System.out.println("用户没有登录"); return false; } //继续提交请求,false 请求不提交了 return true; }}
在03-springboot-web中创建一个config包,创建一个配置类InterceptorConfig,并实现WebMvcConfigurer接口, 覆盖接口中的addInterceptors方法,并为该配置类添加@Configuration注解,标注此类为一个配置类,让Spring Boot 扫描到,这里的操作就相当于SpringMVC的注册拦截器 ,@Configuration就相当于一个applicationContext-mvc.xml
代码示例:
package com.bjpowernode.springboot.config;import com.bjpowernode.springboot.interceptor.LoginInterceptor;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configurationpublic class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { //需要拦截的路径,/**表示需要拦截所有请求 String[]addPathPatterns={"/**"}; //不需要拦截的路径 String [] excludePathPaterns={ "/boot/get", "/boot/post", "/boot/put", "/myservlet" }; //注册一个登录拦截器 registry.addInterceptor(new LoginInterceptor()) .addPathPatterns(addPathPatterns) .excludePathPatterns(excludePathPaterns); //注册一个权限拦截器 如果有多个拦截器 ,只需要添加以下一行代码 //registry.addInterceptor(new LoginInterceptor()) // .addPathPatterns(addPathPatterns) // .excludePathPatterns(excludePathPatterns); }}
配合注解可细化到方法拦截粒度,首先定义一个注解,然后再需要拦截判断的方法处加注解,最后在拦截器的handler中判断是否有这个注解,根据注解分流处理业务逻辑。在业务代码层产生了一定的侵染。
3.细节总结
AOP是一种切面编程的思想,不同于顺序编程,这是一种追求代码零侵染的横向编程思想,只需在配置类中,配置作用点和业务逻辑即可。spring也支持这种思想,实现了相关的接口,提供了更加便捷注解配置方式。
1:在pom文件中引入依赖
copyorg.springframework.boot spring-boot-starter-aop
2:编写AOP类,在类上使用@Aspect、@Component注解。(What层面)
@Aspect:标识这个类是切面类。
@Component:把该类作为bean配置到Ioc容器里。
pic-1590653205702.png
3:编写切入点方法,在方法上使用@PointCut(execution(public * ...))(where层面)
pic-1590653205703.png
重点讲解下execution表达式部分,execution是执行的意思。public * com.cx.timer...看起来非常复杂,晦涩难懂。其实这里就是一个方法名的定义:作用域 返回类型 方法名(参数..)。
其中上图的作用域是:public返回类型:* (* 表示Object类型)方法名(参数..) :com.cx.timer.aop.controller是指具体的包名;.* 表示 该包名下的所有的类;*(..) 表示类下所有的方法,不限定参数。
4:编写切面方法,在想要处理的业务上使用@Before、@AfterReturning、@After、@Around、@AfterThrowing注解。(when层面)
@Before:在切入点方法执行之前执行该方法。
@AfterReturning:在切入点方法执行并有返回值才执行该方法。 @After:在执行切入点方法之后执行该方法。 @Around:在执行切入点方法的前后执行该方法。 @AfterThrowing:在切入点方法抛出异常的时候执行该方法。
pic-1589440513931.png
转载地址:http://fxnws.baihongyu.com/