@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从cookie中获取凭证
String ticket = CookieUtil.getValue(request, "ticket");
if (ticket != null) {
// 查询凭证
LoginTicket loginTicket = userService.findLoginTicket(ticket);
// 检查凭证是否有效
if (loginTicket != null && loginTicket.getStatus() == 0 && loginTicket.getExpired().after(new Date())) {
// 根据凭证查询用户
User user = userService.findUserById(loginTicket.getUserId());
// 在本次请求中持有用户
hostHolder.setUser(user);
System.out.println(hostHolder.toString());
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
User user = hostHolder.getUser();
if (user != null && modelAndView != null) {
modelAndView.addObject("loginUser", user);
}
}
实现拦截器HandlerInterceptor接口时传入用户的信息,从而在前端取到相对应的值。在controller层,根据请求打过来时传入的cookie得到相应的用户名,在数据库拿到相对应的ticket凭证,根据凭证查询用户,在本次请求中持有用户,并在postHandle返回前端一个modelAndView。但是很奇怪的是在使用thymeleaf拿到modelAndView中的loginUser时,如:
<span class="dropdown-item text-center text-secondary" th:utext="${loginUser.username}">username</span>
一直报500错,控制台看原因是说无法解析thymeleaf的index页面的参数,可是后面加断点调试的时候明明modelAndView里面有值啊…
然后就很奇怪,检查了无数遍确认代码没问题,因为是说无法解析index页面的参数,所以后面尝试先不在index页面打印
th:utext="${loginUser.username}"
,先跑出一个modelAndView,看看会不会有一个“缓存”,成功执行后。再在index页面加上这句话,然后再跑一遍
结果就好了…
这坑爹的thymeleaf!!!