Springboot基本结构——拦截器

拦截器,可以把所有从前端来的请求统一拦截。

上图左边是前端,后面是后端,后端处的那个小方框就是拦截器。

检测通过就放行,不通过,那就不行了,不能通过。

对于拦截的统一处理是全部都要返回到登录页面,即login.html。我们使用重定向。之所以使用重定向而不使用转发是因为如果使用转发,而代码部署不在同一台服务器上,就会有潜在bug。

开干!

先看下源码:

最后这个一般是资源的回收操作。

这里有一个面试可能会问的考点,就是拦截器的这个拦截的方法在方法被定义出来之前就运行了。为啥?

这是因为使用了AOP,面向切面编程的技术。

现在看看拦截器第一步怎么做:

 1 /**
 2      * 检测session对象中是否有uid,有就放行,没有就重定向到login.html页面
 3      * @param request 请求对象
 4      * @param response 相应对象
 5      * @param handler 处理器(url+Controller的映射)
 6      * @return true: 放行当前请求; false:拦截当前请求
 7      * @throws Exception
 8      */
 9     @Override
10     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
11         //HttpServletRequest对象获取全局session对象
12         //只用判断是否为空,而不用在意其数据类型,所以这里直接用Object接收即可
13         Object obj = request.getSession().getAttribute("uid");
14         if (obj == null) {
15             response.sendRedirect("/web/login.html");
16             return false;
17         }
18         //请求放行
19         return true;
20     }

这就可以了吗?

NO,现在我们还要注册白名单和黑名单。什么意思呢?像是登录页面和注册页面应该是不用登录就能访问的,而一般的网站都会让你不用注册也能访问index.html,一般是一些主页啥的。这些全部都要添加到白名单里,否则任何请求都会被拦截,那这个项目不用跑了。

白名单有哪些呢?

 黑名单呢?就是用户在登录状态下才能访问的页面。

如何注册拦截器?

直接看代码:

 1 //处理拦截器的注册
 2 @Configuration //去加载当前的拦截器并注册
 3 public class LoginInterceptorConfigurer implements WebMvcConfigurer {
 4     //配置拦截器
 5     @Override
 6     public void addInterceptors(InterceptorRegistry registry) {
 7         //创建自定义拦截器对象
 8         HandlerInterceptor interceptor = new LoginInterceptor();
 9         //配置白名单,结果存放在list集合中
10         List<String> patterns = new ArrayList<>();
11         patterns.add("/bootstrap3/**");
12         // /**表示全部,这里就表示特定的包下的全部文件
13         patterns.add("/css/**");
14         patterns.add("/images/**");
15         patterns.add("/js/**");
16         patterns.add("/web/register.html");
17         patterns.add("/web/login.html");
18         patterns.add("/web/index.html");
19         patterns.add("/web/product.html");
20         patterns.add("/users/register");
21         patterns.add("/users/login");
22         //完成拦截器的注册
23         registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns(patterns);
24     }
25 }

拦截器注册那里,addInterceptor就直接是添加黑名单,而这个方法后面还提供了一个方法,就是excludePath,就是除了。。。的意思,所以我们把白名单存到一个列表里,再将这个列表作为参数传给这个方法就OK了。

还有一点要注意:

如果你不停地测试这个重定向功能,浏览器可能认为这是一个非法操作,甚至会逼停你访问白名单页面的行为,所以这里的测试不要过多,但万一那啥了怎么办?

 

posted @ 2022-09-10 10:08  EvanTheBoy  阅读(294)  评论(0编辑  收藏  举报