用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
- 用HandlerInterceptor实现登陆状态确定
- HandlerInterceptor
- cookie实现保持用户登陆状态
- 使用HandlerInterceptor实现简单的授权
- Spring MVC HandlerInterceptor 实现原理(源码)
- spring mvc实现HandlerInterceptor完成拦截功能
- SpringMVC:java拦截器实现 HandlerInterceptor
- 确定有限状态自动机
- 自动登录、记住我(保存登陆状态)实现
- ASP.NET使用Cookie简单实现记住登陆状态功能
- spring mvc 拦截器需要实现HandlerInterceptor接口
- 实例8:状态栏中显示代表登陆状态的图标(实现仿QQ登陆状态显示)
- 确定和监视连接状态
- was命令行确定服务状态
- 非确定有限状态自动机的构建(一)——NFA的定义和实现
- 非确定有限状态自动机的构建-NFA的定义和实现
- 登陆状态备忘
- iOS 保持登陆状态
- Html数组数组连接concat()
- Java读取Properties文件
- C++学习笔记--继承
- Windows黑科技汇总
- Android中FTP上传、下载(含进度)
- 用HandlerInterceptor实现登陆状态确定
- sequoiadb和mongodb简单对比图
- IE overflow:hidden失效的解决方法
- 晶体管相关
- JAVA设计模式之适配器
- 函数设计 (高质量C++/C编程指南)
- Linux 开发板4G转WiFi热点 手机连接热点上网(三 WiFi模块的移植及AP的建立)
- Apache POI使用详解
- leetcode之169. Majority Element