单体
login
1.LoginFilter(判断是否登入)
if(session.getAttribute("isLogin") == true) 判断是否登入
chain.doFilter
else
1.判断请求是否 是 发送的是 login请求(即是否是其他请求,session失效了,而不是发送的login请求)
1. req.getAttribute("userName") == null
则不是login请求,响应json,(或者抛出异常,在全局异常处理处,返回json)
前端跳转到登入页面,发送login请求
2. req.getAttribute("userName") != null
则是发送的 login请求(访问后台,login接口)
chain.doFilter(); 执行 login接口
2.login接口
判断user是否符合要求,不符合响应 不符合的 json(前端再次跳转登入页面)
符合,则登入成功
1.session.setAttribute("isLogin",true)
2.响应json 中包含 token字符串,为什么不直接返回用户信息呢
因为有token字符串,安全性大大提高(当然也可以直接返回userInfo)
3.访问login接口后,前端拿到token字符串,将他放到cookie中,
然后创建前端拦截器(判断 cookie中是否有 token),有将其放到 请求头中,
去访问,getUserInfo接口,此时已经登入了,过滤器会直接 chain.dofilter
这时可以访问到 getUserInfo接口,用token中的 id 去查询userInfo,返回给前端
前端将 userInfo add到 cookie中,用在各个页面展示 userInfo
4.单体的,用户登入 是用 session/cookie来 控制时长的,不是用token,
token只能说时长到了,拿不到 userInfo,但并不影响 登入时长
logout
提供一个 logout接口,不用再提供一个 Filter,每次请求都判断是否
处于注销状态(和login 不一样),将session失效即可,然后响应
注销成功,前端跳转login页面
多体(登入和注销也是 一个 应用)
在多体应用中,再用cookie和session机制,来判断用户是否登入,和用户注销就不合适了,因为,多体的 session域不同,但是cookie中的JD-id,只能有一个
1.cookie + session(不可取)
广播机制,所有应用的session域是一样的,这样无论操作哪一个应用,
1.登入后,session.setAtrribute("isLogin",true),此时cookie的 JD-id中 id都是一样的
下一次访问其他应用,在Filter中 session.getAttribute("isLogin")是可以获取值的
因为,每一个单体的 session是复制了的,就是说session都是一样的session的id也是一样的
2.同样,用户logout,使session失效,那么每个应用的session应该都失效
这样下次再登入的时候,cookie的 JD-id,就无法获取session,就会新建session
这样就无法获取到 “islogin” 了
2.cookie + redis(不可取)
1.filter中的判断
String key = cookie.get("isLogin")
redis.get(key)
2.登入的时候,redis.set("isLogin",true),并且add cookie("isLogin","isLogin")
3.用户注销,redis.set("isLogin",false)//或者redis 让这个key value失效
4.但是每个 应用的 redis应该是同一个redis,这样首先cookie一直是
cookie("isLogin","isLogin")
redis也是同一个redis
这样每次请求,都过 每个应用的 filter 判断redis中是否拿的到值
拿的到,证明还是登入状态,拿不到证明 redis要么时长到了失效了,要么redis.set("islogin",false)
这时来到else,判断是否是login请求 是,那么login,再次set redis和cookie
并 return,不是前端再次跳转登入页面
5.这时控制登入的是,cookie的时长,和redis的时长失效
==================================================
上面两种 用 cookie的方式不可取(cookie是)
cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie
这样 将登入信息,存再cookie里面有个致命的缺陷,就是cookie的域只和
应用的域相匹配,就是说系统A resp.cookieA ,浏览器访问系统B,是无法发送
cookieA,给系统B的,到头来A系统登入了,到了B系统的 filter 还是 无法拿到
cookieA,从而无法从 redis中取值,判断是否登入
综上 cookie 在 多系统中不可取