单点登录和单点注销

1.在分布式系统架构下是每一个系统都是由一个团队进行维护,每个系统都是单独部署运行一个单独的应用容器如Tomcat,所以,不能将用户的登录信息保存到session中。

多个tomcat的session一般是不能共享的,虽然我们可以利用tomcat自身的session同步功能,但随着机器和业务量增加,效率会越来越低。而且这样做会使业务和Tomcat严重耦
合,不利于扩展,所以我们需要一个单独的系统来维护用户的登录信息,这个系统就是SSO即单点登录系统。

单点登录是一个热门话题,是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。

2.单点登录系统由于其特殊性,不能使用容器的session,只能由用户自己基于session的性质重新开发一套有状态的会话保持系统。
3.解释

传统的session是将用户信息存入内存,维护一个哈希表。每一次请求携带JSESSIONID到服务端,根据此JSESSIONID查找到对应的用户信息。
由此出发我们想到可以利用Redis等内存数据库进行用户信息的存储,自定义Token生成规则将用户信息写入Redis中。这样将用户信息的存储和业务系统进行拆分,使系统更加健
壮,更易于扩展。新加的系统只需要从SSO中获取相关的认证即可进行横向的业务扩展。而且Redis本身的性质也易于进行集群化的部署。

5.StringUtils.isEmpty(userJsonData)是Apache commoms-lang包的工具类。
6.URLDecoder.decode(cookie.getValue(), "UTF-8"),解码。URLEncoder是java.net包里的工具类
7.注意,cookie并不是集合,而是就是一个键值对,只是一对。一个cookie也只能存储一对键值对信息。
8.如果要存储多个键值对,就要用多个cookie来存储。
request.getCoookies()能获得cookie数组,
如:/**
47 * 取得cookie的值
48 * @param request
49 * @param key cookie主键
50 */
51 public static String getCookieValue(HttpServletRequest request, String key) throws UnsupportedEncodingException{
52 for(Cookie cookie : request.getCookies()){
53 if (cookie.getName().equals(key)) {
54 return URLDecoder.decode(cookie.getValue(), "UTF-8");
55 }
56 }
57 return null;
58 }
59 }
6.cookie和session全是hashmap,里面全是键值对。可以添加、删除、获取cookie/session里的key和value。
/**
14 * 添加cookie
15 * @param response
16 * @param key cookie主键
17 * @param value cookie值
18 */
19 public static void addCookie(HttpServletResponse response, String key, String value){
20 Cookie cookie = new Cookie(key, value);
21 cookie.setPath("/");// 这个要设置
22 cookie.setMaxAge(60*60*24*30);//保留一个月 以秒为单位
23 response.addCookie(cookie);

/**
27 * 删除cookie
28 * @param request
29 * @param response
30 * @param key cookie主键
31 */
32 public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String key){
33 Cookie cookies[] = request.getCookies();
34 if (cookies != null) {
35 for (int i = 0; i < cookies.length; i++) {
36 if (cookies[i].getName().equals(key)) {
37 Cookie cookie = new Cookie(key,null);
38 cookie.setPath("/");//设置成跟写入cookies一样的
39 cookie.setMaxAge(0);
40 response.addCookie(cookie);
41 }
42 }
43 }
44 }
45


20.name=new String(name.getBytes("iso8859-1"),"UTF-8");

原文地址:https://www.cnblogs.com/panxuejun/p/6439831.html