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了。
还有一点要注意:
如果你不停地测试这个重定向功能,浏览器可能认为这是一个非法操作,甚至会逼停你访问白名单页面的行为,所以这里的测试不要过多,但万一那啥了怎么办?