上一篇基本介绍完http四大请求GET、POST、PUT、DELETE及过滤器实现方式及注意点,本篇我们将介绍springboot拦截器及Aop切面编码实现方式。
拦截器
拦截器可用于用户登录状态校验、权限校验、请求日志记录等,在web应用具有很广泛的应用。springboot实现拦截器主要有两种方式:
1.通过实现HandlerInterceptor接口或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
2.通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
本篇示例代码通过继承HandlerInterceptorAdapter实现拦截器,具体代码如下
package com.easy.springboot.demo;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.lang.Nullable;import org.springframework.web.client.HttpClientErrorException;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.nio.charset.Charset;public class EasyInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //todo 用户简单权限校验逻辑 String userType = request.getHeader("User-Type"); if (!userType.equals("1")){ throw new HttpClientErrorException(HttpStatus.FORBIDDEN, "userType is error", new HttpHeaders(), "userType is error".getBytes(), Charset.defaultCharset()); } return true; }@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { }}
上诉拦截通过继承HandlerInterceptorAdapter,并重写preHandle来实现对象用户权限简单检验,当用户类型不为1抛出异常,反之则正常执行下游业务代码。通过重写afterCompletion方法可以对返回结果进行处理如统一返回消息体。
完成拦截器创建后还需要将拦截器添加到web容器中,通过实现WebMvcConfigurer接口并重写addInterceptors方法,将上述的拦截器添加到容器中同时需将该类注册到springboot容器中,具体代码实现如下:
package com.easy.springboot.demo;import org.springframework.stereotype.Component;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Componentpublic class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors( InterceptorRegistry registry) { registry.addInterceptor(new EasyInterceptor()); }}
以上便是拦截器的实现方式。
AOP切面实现
在spring中Aop有三种实现方式
1.基于xml配置方式
2.通过纯注解实现
3.通过动态代理实现。
在springboot中常用注解实现,本篇介绍的Aop切面便是改种方式实现,具体代码如下。
package com.easy.springboot.demo;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;import org.springframework.stereotype.Component;@Component@Aspectpublic class EasyAop { @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)") public void easyAop(){ } @Before("easyAop()") /** * 与@Around不能同时使用 */ public void doBefore( JoinPoint joinPoint ){ joinPoint.getArgs(); } @Around("easyAop()") /** * 与@Before不能同时使用 */ public Object doAround( ProceedingJoinPoint joinPoint) throws Throwable { joinPoint.getArgs(); //todo 对方法执行进行控制 添加排他锁等 return joinPoint.proceed(); } @AfterReturning(value = "easyAop()",returning = "keys") public void doAfterreturning(JoinPoint joinPoint,Object keys){ //todo 记录方法调用日志 joinPoint.getArgs(); } @AfterThrowing(value = "easyAop()",throwing = "e") public void resolveThrow(JoinPoint point,Throwable e){ e.printStackTrace(); }}
1.首先创建一个类,并添加注解@Aspect,这样springboot就会按照该类编写的规则创建一个Aop切面。
2.创建一个没有任何返回的方法并添加注解@Pointcut,并设置属性,该属性主要用于控制切面范围,主要有两类控制方式:
a.指定注解如本例:@annotation(org.springframework.web.bind.annotation.PostMapping)表示对带有@PostMapping这个注解的方法进行切面。
b.指定方法:@execution(* com.easy.spring.*.ctrl.*.*(..))表示对指定路径下方法进行切面。
3.设置通知类型
a.前置@Before:表示在执行方法前进行逻辑处理。
b.环绕@Around:可对方法执行前后进行控制。
需要注意:上述两个注解不能同时存在
c.后置@After:表示对方法执行完后进行控制。
d.最终@AfterReturning:表示对方法返回结果进行控制
e.异常@AfterThrowing:表示对方法抛出异常的进行控制。
以上便是springboot中Aop实习方式介绍。