1.在分布式系统架构下是每个系统都是由一个团队进行维护,每一个系统都是单独部署运行一个单独的应用容器如Tomcat,因此,不能将用户的登陆信息保存到session中。java
多个tomcat的session通常是不能共享的,虽然咱们能够利用tomcat自身的session同步功能,但随着机器和业务量增长,效率会愈来愈低。并且这样作会使业务和Tomcat严重耦
合,不利于扩展,因此咱们须要一个单独的系统来维护用户的登陆信息,这个系统就是SSO即单点登陆系统。数据库
单点登陆是一个热门话题,是指在多系统应用群中登陆一个系统,即可在其余全部系统中获得受权而无需再次登陆,包括单点登陆与单点注销两部分。数组
2.单点登陆系统因为其特殊性,不能使用容器的session,只能由用户本身基于session的性质从新开发一套有状态的会话保持系统。
3.解释tomcat
传统的session是将用户信息存入内存,维护一个哈希表。每一次请求携带JSESSIONID到服务端,根据此JSESSIONID查找到对应的用户信息。
由此出发咱们想到能够利用Redis等内存数据库进行用户信息的存储,自定义Token生成规则将用户信息写入Redis中。这样将用户信息的存储和业务系统进行拆分,使系统更加健
壮,更易于扩展。新加的系统只须要从SSO中获取相关的认证便可进行横向的业务扩展。并且Redis自己的性质也易于进行集群化的部署。cookie
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);session
/**
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");分布式