【JavaEE】SpringBoot 拦截器详解 (统⼀功能处理)


Spring Boot 统⼀功能处理,也就是上一节 Spring AOP 的实战应用环节,本节要实现的目标有以下 3 个:

  1. 统⼀⽤户登录权限验证;
  2. 统⼀数据格式返回;
  3. 统⼀异常处理。

这三个应用基本涵盖了企业开发中需要实现的需求,所以把这三个操作弄懂弄熟是很有必要的!

1. 用户登录权限效验

在实现进行用户是否登录了的校验时,学习了spring AOP 之后,我们就可以实现统一的用户登录验证处理了,具体实现是应用到了springboot的拦截器,下面就来进行详细的使用讲解:

1.1 Spring AOP 用户统⼀登录验证的问题

在讲解spring拦截器之前,我们需要知道为什么要使用拦截器,而不是使用前面spring AOP中的前置通知或者环绕通知:
这两个方案具体代码如下:

@Component
@Aspect
public class UserAspect {
   

    // 定义切点方法 controller 包下,子孙包下所有类的所有方法
    @Pointcut("execution(* com.example.demo.controller..*.*(..))")
    public void pointcut(){
   }

    // 前置方法
    @Before("pointcut()")
    public void doBefore(){
   
        System.out.println("这里执行前置方法逻辑");
    }

    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint){
   
        Object obj=null;
        System.out.println("Around 方法开始执行");
        try {
   
            // 执行拦截方法
            obj=proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
   
            throwable.printStackTrace();
        }
        System.out.println("Around 方法结束执行");
        return obj;
    }
}

如果要在以上 Spring AOP 的切⾯中实现⽤户登录权限效验的功能,有以下两个问题:

  1. 没办法获取到 HttpSession 对象。(判断用户是否登录用到)
  2. 我们要对⼀部分⽅法进⾏拦截,⽽另⼀部分⽅法不拦截,如注册⽅法和登录⽅法是不拦截的,这样的话排除⽅法的规则很难定义,甚⾄没办法定义。(除了登录注册不拦截,静态资源不拦截,其余基本都要拦截)

为了解决以上使用spring AOP 没法实现的地方,我们就需要使用到 spring 拦截器,以下是拦截器的详细用法:

1.2 Spring 拦截器

对于以上问题 Spring 中提供了具体的实现拦截器:HandlerInterceptor,拦截器的实现分为以下两个步骤:

  1. 创建⾃定义拦截器,实现 HandlerInterceptor 接⼝的 preHandle(执⾏具体⽅法之前的预处理,拦截逻辑就写在这)⽅法。
  2. 将⾃定义拦截器加⼊ WebMvcConfigureraddInterceptors ⽅法中(加入系统配置,定义拦截规则)

具体实现如下:

1.2.1 自定义拦截器

接下来使用代码来实现⼀个⽤户登录的权限效验,⾃定义拦截器是⼀个普通类,具体实现代码如下:

/**
 * 自定义用户登录的拦截器
 */
@Component // 需要用到属性注入此类时候加
public class LoginIntercept implements HandlerInterceptor {
   
    /**
     * 返回TRUE表示拦截判断通过,可以访问后面的接口,如果返回FALSE表示拦截未通过,直接返回结果给前端
     * 
     * */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
        // 1.得到 httpsession 对象
        HttpSession session=request.getSession(false);
        if (session!=null && session.getAttribute("userinfo")!=null){
   
            // 表示已登录
            return true;
        }
        // 执行到此行代码表示未登录,跳转到登录页面
        response.sendRedirect("/login.html");
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值