【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径

前言

???本期讲解关于拦截器的详细介绍~~~

??感兴趣的小伙伴看一看小编主页:-CSDN博客

?? 你的点赞就是小编不断更新的最大动力

??那么废话不多说直接开整吧~~

目录

???1.拦截器

??1.1拦截器快速入门

1.?定义拦截器

2.配置拦截器

??1.2拦截器的详解

1.拦截路径

2.拦截器执行流程

??1.3登录校验

1.定义拦截器

2.配置拦截器

???2.总结

**??**1.拦截器

强制登录的功能, 后端程序根据Session来判断是否登录, 但是实现法是较烦的

需要修改每个接的处理逻辑

需要修改每个接的返回结果

接定义修改, 前端代码也需要跟着修改

即我们不需要一个一个请求的后端代码进行修改,直接在每个请求之前,进行拦截判断这里的界面是否是用户进行了登录;

??1.1拦截器快速入门

什么是拦截器:

拦截器是Spring框架提供的核功能之, 主要来拦截的请求, 在指定法前后, 根据业务需要执预先设定的代码.

也就是说, 允许开发员提前预定义些逻辑, 在的请求响应前后执. 也可以在请求前阻其执.

在拦截器当中,开发员可以在应程序中做些通性的操作, 如通过拦截器来拦截前端发来的请求, 判断Session中是否有登录的信息. 如果有就可以放, 如果没有就进拦截

大致的流程图如下:

拦截器的大致使用就是一下两步:

1.定义拦截器

2.配置拦截器

大概的意思就是:

首先一个学校的大门的保安,首先要招聘,在招聘到保安人员后,然后再安排这个保安去哪里进行看守,那么招聘就是定义拦截去,安排哪里进行看守就是配置拦截器;

1.定义拦截器

自定义拦截器,就是实现HandlerInterceptor接,并重写其所有法,那么具体的代码就是如下所示的:

复制代码
 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

       log.info("LoginInterceptor ?标?法执?前执?..");
       return true
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
         log.info("LoginInterceptor ?标?法执?后执?..");
       
    }

解释:

preHandle()法:标法执前执. 返回true: 继续执后续操作; 返回false: 中断后续操作.

postHandle()法:标法执后执

afterCompletion()法:视图渲染完毕后执,最后执(后端开发现在乎不涉及视图, 暂不了

解)

这里小编没有重写这里的afterCompletion()方法~~

这段代码就是说明了这两个拦截器一个在请求执行前进行,一个请求后再次执行;设置为true就表示要执行)(不拦截进行放行),反之就是不执行;

2.配置拦截器

我们在定义好拦截器后,那么此时就应该进行安排这个拦截器在哪里工作了,此时就涉及拦截器的配置,实现WebMvcConfigurer接,并重写addInterceptors法,具体的代码如下所示:

复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    //注入拦截器
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**");
    }
}

解释:

这里的大致意思就是安排拦截器到所有请求之前,("/**")代表的路劲就是所有的请求,然后再通过Autowired引进这里的拦截器对象,致此我们就完成了只有打印工作的拦截器,此时运行后控制面板的日志的打印如下所示:

注意:

请求请求,肯定是要进行请求后才会出现这里的日志信息,别忘了在日志观察前,进行请求的发送;

??1.2拦截器的详解

拦截器的程序完成之后,接下来我们来介绍拦截器的使细节。拦截器的使细节我们主要介绍拦截器的拦截路径配置

1.拦截路径

拦截路径是指我们定义的这个拦截器, 对哪些请求效.我们在注册配置拦截器的时候, 通过 addPathPatterns() 法指定要拦截哪些请求. 也可以通过excludePathPatterns() 指定不拦截哪些请求.

如登录校验, 我们希望可以对除了登录之外所有的路径效

代码如下所示:

复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    //注入拦截器
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")             
        ;
    }
}

解释:

addPathPatterns:这里就是指定要拦截的请求;

.excludePathPatterns:这里就是指定不必进行拦截的请求,我们要进进行登录,那么这里肯定是不可以进行拦截的;

常见的路径的拦截:

**注意:**在书写这里的路径的时候,这里的/book/**,第一个这里的正斜杠是不一可以进行省略的,不要问为啥,因为这里小编所犯的错误;

2.拦截器执行流程

正常的情况下,我们的执行流程就是如下所示:

有了拦截器之后,会在调 Controller 之前进相应的业务处理,执的流程如下图:

解释:

1.添加拦截器后, 执Controller的法之前, 请求会先被拦截器拦截住. 执 preHandle() 法,

这个法需要返回个布尔类型的值. 如果返回true, 就表放本次操作, 继续访问controller中的

法. 如果返回false,则不会放(controller中的法也不会执).

  1. controller当中的法执完毕后,再回过来执 postHandle() 这个法以及afterCompletion() 法,执完毕之后,最终给浏览器响应数据
??1.3登录校验
1.定义拦截器

从session中获取信息, 如果session中不存在, 则返回false,并设置http状态码为401, 否则返回true.

代码如下所示:

复制代码
public class LoginInterceptor implements HandlerInterceptor {
    //定义拦截器,重写方法
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        UserInfo userInfo = (UserInfo) session.getAttribute(constant.USER_SESSION_KEY);
        if (userInfo==null || userInfo.getId()<=0){
            //用户未登录
            response.setStatus(401);
            return false;
        }
        return true;
    }
}

解释:

我们这里拿到session后,进行判断,通过这里的key拿到对应的值,通过对象来接收后,判断这里的对象是否为空,或者这里的id的值是否小于0,若满足条件那么设置状态码401,然后进行拦截;

2.配置拦截器
复制代码
  @Override
    public void addInterceptors(InterceptorRegistry registry) {

        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login")
                .excludePathPatterns("/css/**")
                .excludePathPatterns("/js/**")
                .excludePathPatterns("/pic/**")
                .excludePathPatterns("/**/*.html")
        ;
    }

解释:

这里设置所有的后端请求,都包括这里的拦截器,但是我们的目的就是跳转至登录页面,所以这里的请求不必拦截,以及静态的前端请求不必拦截

最后在前端的代码添加如下所示:

复制代码
               error: function (error) {
                    if (error != null && error.status == 401) {
                        location.href = "login.html";
                    }
                }

解释:

当接收到401状态码后,重新定义error方法,直接进行页面的跳转,就完成了页面强制登录的操作了;这里我们响应中设置了状态码,所以这里直接取到状态码;

**??**2.总结

本期小编主要总结了在SpringBoot中统一功能处理的拦截器功能,从简单了解实现方法,定义到配置到如何运用到我们的图书管理系统代码里都做了解释~~

???~~~~最后希望与诸君共勉,共同进步!!!


???以上就是本期内容了, 感兴趣的话,就关注小编吧。

???期待你的关注~~~

相关推荐
Kali_076 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
rzl0218 分钟前
java web5(黑马)
java·开发语言·前端
君爱学习23 分钟前
RocketMQ延迟消息是如何实现的?
后端
guojl37 分钟前
深度解读jdk8 HashMap设计与源码
java
Falling4241 分钟前
使用 CNB 构建并部署maven项目
后端
guojl43 分钟前
深度解读jdk8 ConcurrentHashMap设计与源码
java
程序员小假1 小时前
我们来讲一讲 ConcurrentHashMap
后端
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
A~taoker1 小时前
taoker的项目维护(ng服务器)
java·开发语言