登录功能的完善
在上次文章中,我们已经初步实现了登录的功能,但是还有一部分小细节需要完善。
首先是显示登陆信息部分:
- 用户登录后,显示用户的头像,名称,消息数量…
- 用户未登录,显示注册、登录等信息
同时我们注意到,有许多的地方都需要设置上述要求。如果我们在每个controller都添加方法进行处理,过于繁琐。因此,我们可以通过拦截器指定拦截、排除的路径实现上述功能,实现大量请求的批处理能力。
拦截器
- 1.定义拦截器,实现HandlerInterceptor
package com.guo.controller.interceptor;
import com.guo.entity.LoginTicket;
import com.guo.entity.User;
import com.guo.service.UserService;
import com.guo.util.CookieUtil;
import com.guo.util.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
//1. 首先实现HandlerInterceptor
//2. 重写方法:preHandle、postHandle、afterCompletion
//拦截器:用于拦截ticket的信息
@Component
public class LoginTicketInterceptor implements HandlerInterceptor {
@Autowired
private UserService userService;
@Autowired
private HostHolder hostHolder;
/**
* preHandle:在controller之前执行
* @param request request可以用于从cookie中取出凭证
* @param response
* @param handler 拦截的目标
* @return 在controller之前通过ticket取用户登录信息
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.从cookie中获取ticket 可以通过自定义util获取
String ticket = CookieUtil.getValue(request, "ticket");
//2.根据ticket获取用户
if (ticket != null){
//根据凭证获取凭证对应的实体类
LoginTicket loginTicket = userService.findLoginTicket(ticket);
//验证凭证有有效性[不为空且未过有效期且状态有效]
if (loginTicket != null && loginTicket.getStatus() ==