需求介绍—显示登录信息
我们需要在每个页面的头部都要把登录用户的头像显示出来,另外在详细信息里面你需要显示用户的名字,除此之外如果登录了,我们显示首页 信息 头像 三个功能的链接,否则显示首页 登录两个功能点,也就是根据登录与否显示头部的内容。
我们每个静态页面都有这个内容,都需要显示登录信息,那么开发这个功能你需要每个请求都需要实现这个工能。我们想要低耦合的解决这个功能,就利用 Spring 的拦截器,它可以拦截访问服务器的请求,拦截请求之后可以在拦截这个请求之后的开始或者结束的部分插入一些代码,从而解决一些请求共有点的一些功能实现。
代码实现
使用拦截器的方法:
先写一个类实现 HandlerInterceptor 接口,然后配置拦截器的处理范围,拦截哪些请求,不拦截哪些请求。写个实例,先写类 AlphaInterceptor 实现 HandlerInterceptor 接口:
1 | package com.nowcoder.community.controller.interceptor; |
我们写好了之后要写一个配置类 WebMvcConfig:
一般配置类都是引入第三方的 Bean,但是拦截器需要实现 WebMvcConfigurer 接口。
1 | package com.nowcoder.community.config; |
知道拦截器怎么用了,我们就正式来写一下,根据我们的需求,
我们需要在请求开始时查询登录用户,然后在本次请求中持有用户数据(就是存到内存里),然后在模板视图上引用,最后在请求结束时清理用户数据。
第一步我们知道 Cookie 是从 HttpServletRequest 对象里面取出来的,因为很多情况下都需要获获取 Cookie,所以写一个工具帮我们实现一下 CookieUtil:
1 | package com.nowcoder.community.util; |
其次我们说了我们通过 Ticket 查询到的用户,我们需要把它存下来,但是由于服务器对应客户端是一对多的,它是一个处理多线程的,每个线程隔离的存这个对象,那么我们写个工具 HostHolder 存 User 对象,起到一个容器的作用:
1 | package com.nowcoder.community.util; |
然后写个拦截器 LoginTicketInterceptor:
1 | package com.nowcoder.community.controller.interceptor; |
写好拦截器就要注入到 WebMvcConfig:
1 | package com.nowcoder.community.config; |
然后就是处理页面了。