用HandlerInterceptor实现登陆状态确定

主要目的是:

确定是用户是否登陆,通过每次请求检测ticket时候存在来实现。

基本原理:注册拦截器+实现拦截器+设置线程副本变量

一、注册拦截器:extends WebMvcConfigurerAdapter

@Component
public class WendaWebConfiguration extends WebMvcConfigurerAdapter {
@Autowired
PassportInterceptor passportInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(passportInterceptor);    
    super.addInterceptors(registry);
    }
}

二、实现拦截器:implements HandlerInterceptor

1、配置自己的Interceptor并实现HandlerInterceptor中三个方法。preHandler:指的是请求之前,主要是可以做获取请求参数如cookie,并由此获取cookie中的内容ticket,–》得到loginticket –》得到userId–》得到user的参数。

并把该读取的对象设置到ThreadLocal中,实现并发访问。hostholder.set();

2、postHandler:指的是请求之后返回了modelAndView即将用此modelAndView渲染之前,这时候可以在model中加入自己参数 model.addObject(“user”,hostHolder.get(user));

3、afterCompletion:请求完成之后清楚ThreadLocal中的线程局部变量:hostHolder.clean()

@Component
public class PassportInterceptor implements HandlerInterceptor {

@Autowired
private LoginTicketDao loginTicketDAO;

@Autowired
private UserDao userDAO;

@Autowired
private HostHolder hostHolder;


@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
    String ticket = null;
    if (httpServletRequest.getCookies() != null) {
        for (Cookie cookie : httpServletRequest.getCookies()) {
            if (cookie.getName().equals("ticket")) {
                ticket = cookie.getValue();
                break;
            }
        }
    }

    if (ticket != null) {
        LoginTicket loginTicket = loginTicketDAO.selectByTicket(ticket);
        if (loginTicket == null || loginTicket.getExpired().before(new Date()) || loginTicket.getStatus() != 0) {
            return true;
        }

        User user = userDAO.selectById(loginTicket.getUserId());
        hostHolder.setUser(user);
    }
    return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    if (modelAndView != null && hostHolder.getUser() != null) {
        modelAndView.addObject("user", hostHolder.getUser());
        System.out.println("passposrt setting user"+hostHolder.getUser());
    }
}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        hostHolder.clear();
    }
}

三、设置线程副本变量:implements HandlerInterceptor

@Component
public class HostHolder {
private static ThreadLocal users = new ThreadLocal();

public User getUser() {
    return users.get();
}

public void setUser(User user) {
    users.set(user);
}

public void clear() {
    users.remove();
}
}

你可能感兴趣的:(javaWeb)