用HandlerInterceptor实现登陆状态确定

来源:互联网 发布:苏联对中国的援助知乎 编辑:程序博客网 时间:2024/05/17 01:34

主要目的是:

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

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

一、注册拦截器:extends WebMvcConfigurerAdapter

@Componentpublic class WendaWebConfiguration extends WebMvcConfigurerAdapter {@AutowiredPassportInterceptor passportInterceptor;@Overridepublic 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()

@Componentpublic class PassportInterceptor implements HandlerInterceptor {@Autowiredprivate LoginTicketDao loginTicketDAO;@Autowiredprivate UserDao userDAO;@Autowiredprivate HostHolder hostHolder;@Overridepublic 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;}@Overridepublic 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());    }}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {        hostHolder.clear();    }}

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

@Componentpublic class HostHolder {private static ThreadLocal<User> users = new ThreadLocal<User>();public User getUser() {    return users.get();}public void setUser(User user) {    users.set(user);}public void clear() {    users.remove();}}
0 0
原创粉丝点击