主要讲例子,结合例子讲逻辑和原理!
1.拦截器介绍
拦截器概念这里就不讲了 到下一章 和过滤器 监听器一起讲,有对比性!
2.例子简单架构介绍(很糙)
这里只讲一遍,以后的例子基本上都是这个架构。目录结构如下:
这里只用关心我画红线框框的部分。
springboot3 是我例子项目的总的父项目,一些共有的依赖包都在这个项目里面。(pom文件这里就不贴了,文章后面会给下载地址!)
base 是springboot3 子项目 也是dao层 所有mybatisplus逆向工程生成的文件都在这个项目中!
springboot2 是今天这篇文章的例子 他下面有service,web两个子项目 也是他的service和web层
关于mave怎么依赖的,自己照着我的项目结构多在idea练习练习就好了!
3.实际项目中拦截器创建
实现HandlerInterceptor这个接口,重写 他的这三个接口
每个接口是干嘛的什么时候执行,在代码中有详细的介绍!实现这个接口后 springboot不知道有这个东西呀,所以咱们还要让它知道有这个!所以就要注册到springboot中,我记得有好几种方法,这里只讲一种!
这个项目中权限校验是结合自定义注解在一起的 ,拦截到后,通过反射判断方法上有没有注解,有注解进行拦截,获取权限值。没有就放行。自定义注解可以自行百度,我代码上也有一部分注释!这里只是做了 拦截登录和权限,如果需要 不登录也可以看到一部分页面的话,可以自定义登录注解,仿照权限拦截器中的写!
这里有好几个坑!
-
有些文章中这里 拦截器注册的时候 不实现WebMvcConfigurer 继承WebMvcConfigurerAdapter 。编辑器显示这个方法过时了。这个方法在spring5.0好像 就被废弃了,可以自行百度查阅
-
还有的文章是没有 创建bean 而是在注入的时候直接 new拦截器对象 ,这样做会出现在拦截器中注入service接口时 为null,注入不了。原因:bean是在容器中,容器创建在spring上下文加载时,而拦截器加载时间在这之前。容器里面还没有service接口bean 然后你就要取出来用,肯定是null了。解决办法如上
-
实现WebMvcConfigurer 还有几个方法可以重写 有兴趣的可以自己百度这个接口查找 用途。
-
getRequestDispatcher和sendRedirect 重定向区别: getRequestDispatcher是服务器内部跳转,地址栏信息不变,只能跳转到web应用内的网页。 sendRedirect是页面重定向,地址栏信息改变,可以跳转到任意网页。 这两条网上都查得到,但看着比较乱,现提供我测试的结果(仅供参考): 1.getRequestDispatcher分成两种,可以用request调用,也可以用getServletContext()调用 不同的是request.getRequestDispatcher(url)的url可以是相对路径也可以是绝对路径。 而this.getServletContext().getRequestDispatcher(url)的url只能是绝对路径。 注:request.getRequestDispatcher(url)之所以可以使用相对路劲,是因为在getRequestDispatcher(url)方法中封装了ServletContext.getRealPath()以获得相应的项目根路径,再通过字符串相加,从而可以获得一个完整的路径
-
路径问题 访问的路径最前面加不加 “/”的区别:加”/”代表 绝对路径,是从站点的根目录开始找 不加”/”代表 相对路径,是从当前路径开始找 比如"/000/000" 下一个访问的接口不加/ 则访问 的是 /000/下一个接口名
-
使用springboot+thymeleaf模板时 所有的跳转都必须经过后台接口跳转,不能直接页面跳页面
- 配置文件中
# MyBatis plus 驼峰命名 mybatis-plus.configuration.map-underscore-to-camel-case=true 驼峰命名的映射
## json时间格式设置 spring.jackson.time-zone=GMT+8 spring.jackson.date-format=yyyy/MM/dd HH:mm:ss
- 有一个简单的全局异常处理器,有时间可以参考