首页 > 其他分享 >SpringBoot登录校验(五)拦截器Interceptor

SpringBoot登录校验(五)拦截器Interceptor

时间:2024-04-06 19:29:05浏览次数:24  
标签:拦截器 SpringBoot depts public 放行 拦截 执行 Interceptor

什么是拦截器

  • 是一种动态拦截方法调用的机制,类似于过滤器。

  • 拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行。

拦截器的作用:

  • 拦截请求,在指定方法调用前后,根据业务需要执行预先设定的代码。

在拦截器当中,我们通常也是做一些通用性的操作,比如:我们可以通过拦截器来拦截前端发起的请求,将登录校验的逻辑全部编写在拦截器当中。在校验的过程当中,如发现用户登录了(携带JWT令牌且是合法令牌),就可以直接放行,去访问spring当中的资源。如果校验时发现并没有登录或是非法令牌,就可以直接给前端响应未登录的错误信息。

下面我们通过快速入门程序,来学习下拦截器的基本使用。拦截器的使用步骤和过滤器类似,也分为两步:

  1. 定义拦截器

  2. 注册配置拦截器

Interceptor详解

自定义拦截器:实现HandlerInterceptor接口,并重写其所有方法

//自定义拦截器
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    //目标资源方法执行前执行。 返回true:放行    返回false:不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle .... ");
        
        return true; //true表示放行
    }
​
    //目标资源方法执行后执行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle ... ");
    }
​
    //视图渲染完毕后执行,最后执行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion .... ");
    }
}

注意:

preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行

postHandle方法:目标资源方法执行后执行

afterCompletion方法:视图渲染完毕后执行,最后执行

注册配置拦截器:实现WebMvcConfigurer接口,并重写addInterceptors方法

@Configuration  
public class WebConfig implements WebMvcConfigurer {
​
    //自定义的拦截器对象
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;
​
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       //注册自定义拦截器对象
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
    }
}

 拦截路径

在Inteerceptor配置文件中指定拦截路径,通过addPathPatterns("要拦截路径")方法,就可以指定要拦截哪些资源。

在入门程序中我们配置的是/**,表示拦截所有资源,而在配置拦截器时,不仅可以指定要拦截哪些资源,还可以指定不拦截哪些资源,只需要调用excludePathPatterns("不拦截路径")方法,指定哪些资源不需要拦截。

在拦截器中除了可以设置/**拦截所有资源外,还有一些常见拦截路径设置:

拦截路径含义举例
/*一级路径能匹配/depts,/emps,/login,不能匹配 /depts/1
/**任意级路径能匹配/depts,/depts/1,/depts/1/2
/depts/*/depts下的一级路径能匹配/depts/1,不能匹配/depts/1/2,/depts
/depts/**/depts下的任意级路径能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1

执行流程

介绍完拦截路径的配置之后,接下来我们再来介绍拦截器的执行流程。通过执行流程,大家就能够清晰的知道过滤器与拦截器的执行时机。

  • 当我们打开浏览器来访问部署在web服务器当中的web应用时,此时我们所定义的过滤器会拦截到这次请求。拦截到这次请求之后,它会先执行放行前的逻辑,然后再执行放行操作。而由于我们当前是基于springboot开发的,所以放行之后是进入到了spring的环境当中,也就是要来访问我们所定义的controller当中的接口方法。

  • Tomcat并不识别所编写的Controller程序,但是它识别Servlet程序,所以在Spring的Web环境中提供了一个非常核心的Servlet:DispatcherServlet(前端控制器),所有请求都会先进行到DispatcherServlet,再将请求转给Controller。

  • 当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行preHandle()方法,这个方法执行完成后需要返回一个布尔类型的值,如果返回true,就表示放行本次操作,才会继续访问controller中的方法;如果返回false,则不会放行(controller中的方法也不会执行)。

  • 在controller当中的方法执行完毕之后,再回过来执行postHandle()这个方法以及afterCompletion() 方法,然后再返回给DispatcherServlet,最终再来执行过滤器当中放行后的这一部分逻辑的逻辑。执行完毕之后,最终给浏览器响应数据。

 登录校验实现

 拦截器(Interceptpr包)

//自定义拦截器
@Component //当前拦截器对象由Spring创建和管理
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
    //前置方式
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle .... ");
        //1.获取请求url
        //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行

        //3.获取请求头中的令牌(token)
        String token = request.getHeader("token");
        log.info("从请求头中获取的令牌:{}",token);

        //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
        if(!StringUtils.hasLength(token)){
            log.info("Token不存在");

            //创建响应结果对象
            Result responseResult = Result.error("NOT_LOGIN");
            //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
            String json = JSONObject.toJSONString(responseResult);
            //设置响应头(告知浏览器:响应的数据类型为json、响应的数据编码表为utf-8)
            response.setContentType("application/json;charset=utf-8");
            //响应
            response.getWriter().write(json);

            return false;//不放行
        }

        //5.解析token,如果解析失败,返回错误结果(未登录)
        try {
            JwtUtils.parseJWT(token);
        }catch (Exception e){
            log.info("令牌解析失败!");

            //创建响应结果对象
            Result responseResult = Result.error("NOT_LOGIN");
            //把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)
            String json = JSONObject.toJSONString(responseResult);
            //设置响应头
            response.setContentType("application/json;charset=utf-8");
            //响应
            response.getWriter().write(json);

            return false;
        }

        //6.放行
        return true;
    }

注册配置拦截器(Config包)

@Configuration  
public class WebConfig implements WebMvcConfigurer {
    //拦截器对象
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       //注册自定义拦截器对象
        registry.addInterceptor(loginCheckInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

 

标签:拦截器,SpringBoot,depts,public,放行,拦截,执行,Interceptor
From: https://blog.csdn.net/qq_42736179/article/details/137350657

相关文章

  • [AIGC] SpringMVC, Filter, Interceptor之间关系详解
    在Web应用开发过程中,我们经常需要处理各样的HTTP请求和响应。在Spring框架中,我们主要借助SpringMVC、Filter和Interceptor来处理这些任务。那么,这三者之间有什么关系,又分别扮演着什么角色呢?本文将带你一探究竟。文章目录什么是SpringMVC,Filter,和Interceptor?Spri......
  • 基于SpringBoot+Vue导师选择管理系统设计和实现(源码+LW+部署讲解)
    博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs......
  • Springboot+Vue宿舍管理系统
    Springboot+Vue宿舍管理系统体验地址见:http://www.cdmzl.cn/index宿舍管理系统的一些主要功能介绍:基本信息管理(完成)学生信息管理:录入、修改和查询学生的基本信息,如姓名、性别、学号、班级、联系方式等。宿舍信息管理:录入、修改和查询宿舍的基本信息,如宿舍号、楼层、房间类......
  • 【包远程安装运行】SpringBoot+Mysql实现的在线兼职实习招聘管理系统源码+运行教程+开
    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线招聘系统,主要实现了在线招聘基本操作流程的全部功能,系统分普通用户、管理员等角色,除基础脚手架外,实现的功能有:管理员:系统管理、职位管理、新闻咨询管理、简历投递管理、在线统计等。普通用户(......
  • 【包远程安装运行】:SpringBoot+Mysql健身房在线预约管理系统源码+运行视频+开发文档(参
    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的健身房在线预约管理系统,系统分四个角色,管理员,职工、教练、前台用户,各角色功能如下:管理员:系统管理(角色、权限、菜单等)、职工管理、健身会员管理、会员充值管理、健身项目管理、健身百科管理、健身......
  • 【Java程序设计】【C00508】基于(JavaWeb)Springboot的企业车辆管理系统(含论文+PPT)
    基于(JavaWeb)Springboot的企业车辆管理系统(含论文+PPT)项目简介开发环境项目技术运行截图下载源码博主介绍:java高级开发,从事互联网行业十年,已经做了八年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。项目简介开发环境......
  • 【Java程序设计】【C00512】基于(JavaWeb)Springboot的协同过滤的私人诊所管理系统(含论
    基于(JavaWeb)Springboot的协同过滤的私人诊所管理系统(含论文+PPT)项目简介开发环境项目技术运行截图下载源码博主介绍:java高级开发,从事互联网行业十年,已经做了八年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。项目简介......
  • 基于java中的springboot实现海滨体育馆管理系统的设计与实现演示【附项目源码+论文说
    基于springboot实海滨体育馆管理系统的设计与实现演示摘要本基于SpringBoot的海滨体育馆管理系统设计目标是实现海滨体育馆的信息化管理,提高管理效率,使得海滨体育馆管理工作规范化、高效化。本文重点阐述了海滨体育馆管理系统的开发过程,以实际运用为开发背景,基于Spring......
  • 基于java中的springboot框架实现服装销售平台系统【附项目源码+论文说明】
    基于SpringBoot实现服装销售平台系统设计演示摘要随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了“衣依”服装销售平台的开发全过程。通过分析企业对于“衣依”服装销售平台的需求,创建了一个计算机管理“衣依”服装销售平......
  • 18.SpringBoot项目_员工管理系统总结 上
    首先构思项目这里推荐一下progress思维导图当然习惯了纸张的我!是的没看错就是一个这样的--查阅资料求助AI睡觉吃饭琢磨耗时一个月完成(哈哈纯不会学生)不禁想到了当初的jdbc对比一下:现在的当然使用到了模板不过我想的太简单模板一千多行将自己的项目套进去......