
拦截器处理的是请求,因此也属于表现层的逻辑。
首先编写拦截器的示例,通过@Component注解声明交给Spring 容器管理。另外实现一个HandlerIntercept的接口,其中接口中实现了三个方法。

拦截器示例
preHandle是在Controller处理请求前面执行,该方法返回的是布尔值。因此当返回false是要取消这个请求了,不执行了。所以通常我们都是true.

实例化日志之后,在方法中添加日志的。
postHandle是在Controller执行以后执行的。postHandler的参数与preHandler的参数一样以外,还具有ModelAndView参数,因为该方法是在Controller之后执行,此时主要的逻辑请求处理已经 完成了,下一步主要模板引擎,给页面返回渲染的内容,因此在模板引擎中可能需要用到获取数据或封装数据。

afterCompletion与postHandle的区别在于afterCompletion是在模板引擎之后执行的,postHandle是在Controller之后模板引擎之前执行的。

编写配置类,通常是声明第三方的Bean,但是配置器与其他不一样,我这个配置类需要实现一个接口WebMvcConfigurer.
首先我们注入拦截器。注入后实现WebMvcConfigurer在某个方法中实现拦截器。我们需要实现这样的一个方法addInterceptors,利用参数将对象传进来我们是利用传进的对象注册拦截器。通过add添加拦截器,表示会拦截一切请求,但是如果你们希望一些请求被拦截可以同excludePathPatterns表示你可以排除掉那些路径,即那些路径不需要拦截,比如静态资源, 通过通配符说明所有该目录下所有css都不考虑。如果是若干个请求被拦截的可以通过addPathPatterns明确需要添加路径,即希望拦截注册和登录的功能
拦截器的应用分为四步:
第一步:在请求开始时查询登录用户
第二步:在本次请求中持有用户数据
第三步:在模板视图上显示用户数据
第四步:在请求结束时清理用户数据
假设用户登录,浏览器中存了凭证即cookie中存有ticket.浏览器在访问服务器时都会发送给服务器Cookie,服务器即可从cookie中得到凭证。这个凭证关联的是用户,我们很容易通过一张表Login_ticket查询到用户,其实是用户的id.我们最终是运用到模板上,所以将通过id的到user放入到model中,就可以提交给模板,最终模板向浏览器响应生成了一个HTML。
User数据不敏感而ticket不那么敏感
每次请求都是这么个流程

首先实现拦截器

Cookie是通过request传过来的。所以我们可以把Cookie进行封装一下。
getValue就是从Cookie中取值。参数中传入request对象,另外和所取的key的名字name是什么?
Cookie是数组,通过变遍历和判断实现。
在拦截器中对Cookie处理首先从Cookie中获取凭证。对于取到的凭证进行判断。如果ticket不为空则进行了登录,登录后查询一下这个ticket。

注入Userservice将凭证传入就可获得Login的对象,查询凭证后还需要判断凭证是否有效,同时凭证还有一个过期时间,如果超过也是无效。

持有用户就是对用户进行保存。服务器 在处理这个请求的时候是多线程环境,所有我们需要考虑线程的隔离。在多线程中有一个工具ThreadLocal.
创建衣蛾HostHolder的类,添加@Component将其放入到注解中。

以线程为Key存取这个值的。




拦截器实现后需要配置。
排除全部静态请求

首页任何人都可以看到,但是消息没有登录的时候是看不到的。所以我们需要做一个判断,只有登录的时候显示,如果没有就不显示。
注册和登录则相反

登录用户的显示与消息一样。

动态头像

用户登录名
