在SpringBoot项目中整合拦截器的详细步骤

 更新时间:2022年09月07日 09:48:20   作者:散一世繁华,颠半世琉璃  
在系统中经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中,即平时所说的"权限检测"及"日志记录",下面这篇文章主要给大家介绍了关于在SpringBoot项目中整合拦截器的相关资料,需要的朋友可以参考下

引言

拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:

1.权限检查:如登录检测,进入处理程序检测用户是否登录,如果没有,则直接返回登录页面或error错误页面;

2.性能检测:有时系统在某段时间莫名其妙很慢,我们可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间;

3.通用行为;读取cookie得到用户信息并将用户对象放入请求,从而方便后序流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可以使用功能拦截器实现。

下面我来详细介绍如何在SpringBoot项目中搭建拦截器的步骤。

1.创建一个SpringBoot项目工程

打开IDEA,点击文件,选择新建项目,点击Spring Initializr,然后根据自己的需求设置项目名称,位置以及JDK。这里需要注意,服务器的URL最好设置为阿里云服务器,这样可以使得项目加载地更快。

点击下一步后 ,选择2.4.1的SpringBoot版本 ,导入Spring Web依赖后点击完成即可。

2.配置自定义的拦截器

在自定义的拦截器类中要继承HandlerInterceptor,只有继承了HandlerInterceptor 的类才算是一个拦截器,同时根据需求重写preHandle,postHandle以及afterCompletion方法。

具体编辑的拦截器如下所示:代码中的url请求将在controlelr控制器中编写。另外需要注意的是User是一个实体类,包括id与username两个属性以及set,get方法,这里就不具体展示了。

package com.xing.springbootinterceptor.interceptor;

import com.xing.springbootinterceptor.model.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自定义的拦截器 只有继承了HandlerInterceptor 自定义的类才算是一个拦截器
public class UserInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //编写拦截的规则
        //判断用户是否登录 从session中取值
        User user=(User) request.getSession().getAttribute("user");
        if(user==null){
            //未登录
            response.sendRedirect(request.getContextPath()+"/user/error");//重定向
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

3.注册拦截器

编写完自定义的拦截器后,我们还需要将自定义的拦截器注册到Java的配置类中,方便SpringBoot项目启动的时候读取Config配置类。

我们需要创建一个类,实现WebMvcConfigurer接口并在类名上使用 @Configuration注解 表明这是一个配置类,其实就类似于我们在SpringMVC中的XML配置文件,不过现在就用纯Java代码配置而已。

然后在该类中实现 addInterceptors方法,从而把需要拦截的请求以及需要排除的请求注册进去,方便项目启动后的读取。

package com.xing.springbootinterceptor.config;
import com.xing.springbootinterceptor.interceptor.UserInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//表明这是一个配置类 即相当于之前的xml配置文件
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    //这个配置类主要用来添加拦截请求
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String[] addPathPatterns={
                "/user/**"
        };//设置拦截的路径 不设置将会拦截所有的请求
        String[] excludePathPatterns={
                "/user/out",
                "/user/error",
                "/user/login"
        };//要排除的路径 排除的路径说明不需要用户登录也可以访问
        //InterceptorRegistry 拦截器注册类
        registry.addInterceptor(new UserInterceptor()).addPathPatterns(addPathPatterns).excludePathPatterns(excludePathPatterns);
//        WebMvcConfigurer.super.addInterceptors(registry);
    }
}

4.编写控制器

前面展示了不少的url请求,相信没有看到具体的控制器一定有点晕头转向的,这就展示控制器的具体代码,如下所示:

package com.xing.springbootinterceptor.controller;
import com.xing.springbootinterceptor.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController //该注解相当于@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/login")
    public String login(HttpServletRequest request){
    //这里只是模拟登录 一旦输入该请求 则表示登录成功 便我往session中存值
        User user = new User();
        user.setId(1001);
        user.setUsername("张三");
        //将用户的信息存放到session中
        request.getSession().setAttribute("user",user);
        return "login success";
    }
    //该请求需要用户登录之后才可访问
    @RequestMapping("/center")
    public String center(){
        return "See Center Message";
    }
    //该请求不登录也可以访问
    @RequestMapping("/out")
    public String out(){
        return "Out See anytime";
    }
    //如果用户未登录访问了需要登录的请求 便会自动跳转到该路径
    @RequestMapping("/error")
    public String error(){
        return "error";
    }
}

通过查看控制器的代码相信大多数小伙伴就能猜测到具体项目演示的结果了,这里就不具体展示运行的效果了。

总结

到此这篇关于在SpringBoot项目中整合拦截器的文章就介绍到这了,更多相关SpringBoot项目整合拦截器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于RabbitMQ的Channel默认线程

    关于RabbitMQ的Channel默认线程

    这篇文章主要介绍了关于RabbitMQ的Channel默认线程,通过jvm工具观察rabbitmq的线程使用情况,发现生产者每发一条消息,消费者这边就会创建一条线程,言下之意,一个channel当消息来到时就会异步处理这些消息,需要的朋友可以参考下
    2023-09-09
  • spring5 webclient使用指南详解

    spring5 webclient使用指南详解

    本篇文章主要介绍了spring 5 webclient使用指南详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 如何在Java中优雅地使用正则表达式详解

    如何在Java中优雅地使用正则表达式详解

    这篇文章主要给大家介绍了关于如何在Java中优雅地使用正则表达式的相关资料,正则表达式就是一个字符串,但和普通的字符串不同的是,正则表达式是对一组相似字符串的抽象,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • 详解Java打包镜像部署

    详解Java打包镜像部署

    这篇文章主要介绍了Java打包镜像部署,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Java实现按年月打印日历功能【基于Calendar】

    Java实现按年月打印日历功能【基于Calendar】

    这篇文章主要介绍了Java实现按年月打印日历功能,涉及java基于Calendar进行日期运算的相关操作技巧,需要的朋友可以参考下
    2018-03-03
  • Springboot swagger配置过程详解(idea社区版2023.1.4+apache-maven-3.9.3-bin)

    Springboot swagger配置过程详解(idea社区版2023.1.4+apache-maven-3

    这篇文章主要介绍了Springboot-swagger配置(idea社区版2023.1.4+apache-maven-3.9.3-bin),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Spring基于advisor配置aop过程解析

    Spring基于advisor配置aop过程解析

    这篇文章主要介绍了Spring基于advisor配置aop过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • springboot 使用yml配置文件给静态变量赋值教程

    springboot 使用yml配置文件给静态变量赋值教程

    这篇文章主要介绍了springboot 使用yml配置文件给静态变量赋值教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • SpringBoot将所有依赖(包括本地jar包)打包到项目

    SpringBoot将所有依赖(包括本地jar包)打包到项目

    这篇文章主要介绍了SpringBoot将所有依赖(包括本地jar包)打包到项目,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • JavaMail实现发送超文本(html)格式邮件的方法

    JavaMail实现发送超文本(html)格式邮件的方法

    这篇文章主要介绍了JavaMail实现发送超文本(html)格式邮件的方法,实例分析了java发送超文本文件的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论