spring boot java web 接口调试_Spring-boot躺着入门系列玩转web之篇三

上一篇基本介绍完http四大请求GET、POST、PUT、DELETE及过滤器实现方式及注意点,本篇我们将介绍springboot拦截器及Aop切面编码实现方式。

拦截器

7e384badfe070be79c6b8a58c2dffb9d.png

拦截器可用于用户登录状态校验、权限校验、请求日志记录等,在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有三种实现方式

9eea13bc452e70f2eec2d95f22ef2a6b.png

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实习方式介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值