标签:jin als each time 压缩 掘金 字符 更新 request对象
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。 以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)
服务端生成token后,将token与user对象存储在Map结构中,token为Key,user对象为value,response.addCookie()生成新的Cookie,名为token,值为token的值。
当有多个系统时,认证机制的流程如下:
分析
当系统有多个并且在不同域(domain)时,Cookie只会作用在当前域下。
将token写入所有域的Cookie中才是解决跨域SSO的核心。
如何读取Cookie?
通过Servlet中的request对象可以读取到Cookie数组,然后foreach遍历读取,一般只是获取到nam和value,其他信息写入到浏览器后,浏览器不主动再发回来,读取并无意义。
Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { System.out.println( cookie.getName() + cookie.getValue() + cookie.getMaxAge() + cookie.getPath() + cookie.getDomain() + cookie.getSecure() + cookie.isHttpOnly()//客户端js是否可以获取 ); } }
如何写入Cookie带到浏览器?
新建Cookie对象设置一系列属性,然后添加到response中去。需要注意的是,当设置path为“/”时,表示所有路径都会被该Cookie作用到,如果设置为/path1
那么由/path2
发起请求就不会携带该Cookie。默认不设置只作用在当前路径下。
Cookie cookie = new Cookie("myCookieName","myCookieValue"); cookie.setHttpOnly(false);//Javascript不能处理 //一个正值表示cookie将在经过许多秒之后过期。注意,值是cookie过期的最大时间,而不是cookie当前的时间。 //负值表示cookie没有持久存储,在Web浏览器退出时将被删除。零值会导致删除cookie。 cookie.setMaxAge(-1000); cookie.setSecure(false);//如果为true,仅支持HTTPS协议 //cookie对指定目录中的所有页面以及该目录子目录中的所有页面都可见。 cookie.setPath("/"); //cookie.setDomain("www.a.com");//默认情况下,cookie只返回给发送cookie的服务器。 response.addCookie(cookie);
修改Cookie
修改更新Cookie时,除了要保证Cookie的name是相同的,也要保证Cookie的一系列属性是相同的,否则浏览器会生成新的Cookie。
删除Cookie
只需要设置Cookie的MaxAge为负值,意味着是过去的Cookie,浏览器就会清除。
参考文献---掘金
标签:jin als each time 压缩 掘金 字符 更新 request对象
原文地址:https://www.cnblogs.com/JonaLin/p/12746176.html