![登录认证的几种基本方式]()
登录认证的几种基本方式
一,session
1. 合法用户登录时,会将其用户信息存到session中
1
| session.setAttribute("user",user);
|
2. 当处理需要权限的请求时,拦截器会查看session是否存在用户信息,有则放行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if(user == null){ response.setStatus(401); return false; } UserHolder.saveUser((User)user); return true; } }
public class UserHolder { private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>(); public static void saveUser(UserDTO user){ tl.set(user); } public static UserDTO getUser(){ return tl.get(); } public static void removeUser(){ tl.remove(); } }
|
3,session共享在分布式系统下的局限及其解决方案
分布式系统下,服务器与服务器之间是隔离的,它们的session是不共享的,这就存在session同步的问题
- 可以在不同服务器上session数据进行复制
- 使用session集中存储(session信息存入redis,memcached,hbase等)
二,Token
用户登录时,会将用户信息存入redis中并生成一个随机串token作为内容的key,并把token返回给用户
三,JWT
JWT依据某种规则将用户信息存储在一个JWT令牌中,内含过期时间。
因此服务器无需存储jwt信息,也从而导致用户注销后token仍然有效而存在风险