前言
???本期讲解关于拦截器的详细介绍~~~
??感兴趣的小伙伴看一看小编主页:-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接,并重写其所有法,那么具体的代码就是如下所示的:
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info("LoginInterceptor ?标?法执?前执?..");return true}@Overridepublic 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 {//注入拦截器@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}
解释:
这里的大致意思就是安排拦截器到所有请求之前,(“/**”)代表的路劲就是所有的请求,然后再通过Autowired引进这里的拦截器对象,致此我们就完成了只有打印工作的拦截器,此时运行后控制面板的日志的打印如下所示:
注意:
请求请求,肯定是要进行请求后才会出现这里的日志信息,别忘了在日志观察前,进行请求的发送;
??1.2拦截器的详解
拦截器的程序完成之后,接下来我们来介绍拦截器的使细节。拦截器的使细节我们主要介绍拦截器的拦截路径配置
1.拦截路径
拦截路径是指我们定义的这个拦截器, 对哪些请求效.我们在注册配置拦截器的时候, 通过 addPathPatterns() 法指定要拦截哪些请求. 也可以通过excludePathPatterns() 指定不拦截哪些请求.
如登录校验, 我们希望可以对除了登录之外所有的路径效
代码如下所示:
@Configuration
public class WebConfig implements WebMvcConfigurer {//注入拦截器@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/user/login") ;}
}
解释:
addPathPatterns:这里就是指定要拦截的请求;
.excludePathPatterns:这里就是指定不必进行拦截的请求,我们要进进行登录,那么这里肯定是不可以进行拦截的;
常见的路径的拦截:
**注意:**在书写这里的路径的时候,这里的/book/**,第一个这里的正斜杠是不一可以进行省略的,不要问为啥,因为这里小编所犯的错误;
2.拦截器执行流程
正常的情况下,我们的执行流程就是如下所示:
有了拦截器之后,会在调 Controller 之前进相应的业务处理,执的流程如下图:
解释:
1.添加拦截器后, 执Controller的法之前, 请求会先被拦截器拦截住. 执 preHandle() 法,
这个法需要返回个布尔类型的值. 如果返回true, 就表放本次操作, 继续访问controller中的
法. 如果返回false,则不会放(controller中的法也不会执).
2. controller当中的法执完毕后,再回过来执 postHandle() 这个法以及afterCompletion() 法,执完毕之后,最终给浏览器响应数据
??1.3登录校验
1.定义拦截器
从session中获取信息, 如果session中不存在, 则返回false,并设置http状态码为401, 否则返回true.
代码如下所示:
public class LoginInterceptor implements HandlerInterceptor {//定义拦截器,重写方法@Overridepublic 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.配置拦截器
@Overridepublic 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中统一功能处理的拦截器功能,从简单了解实现方法,定义到配置到如何运用到我们的图书管理系统代码里都做了解释~~
???~~~~最后希望与诸君共勉,共同进步!!!
???以上就是本期内容了, 感兴趣的话,就关注小编吧。
???期待你的关注~~~