发表于: 2021-03-02 23:00:54

1 1295


今天完成的事情:
继续了解cookie和session
了解Token
任务5伪代码



明天计划的事情:
写代码


遇到的问题:
帮师弟走入学流程,花了点时间





收获:
关于session的疑问

对session的定义:从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。
有三个问题。
为什么浏览器关闭代表一次会话结束?
关闭时发生了什么操作导致会话结束?
为什么那个操作执行意味着会话结束?

这个问题和cookie有关,因为session id 是存在 cookie 中,而Cookie的两种类型有两种类型:会话Cookie (Session Cookie)和持久性Cookie (Persistent Cookie)

服务器向浏览器响应的Cookie就是会话Cookie。会话Cookie被保存在浏览器的内存中,当浏览器关闭时,内存被释放,内存中的Cookie自然也就烟消云散。
关闭浏览器引发Cookie消失,下次还要重新登录。能不能向客户端响应持久性Cookie呢?只要设置Cookie的持久化时间即可!
通过设置MaxAge>0,响应持久性Cookie,会存在电脑硬盘的特定文件夹下(浏览器自定义的)
如下代码:
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
try {
if (cookieValue == null) {
cookieValue = "";
} else {
cookieValue = URLEncoder.encode(cookieValue, encodeString);
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request) {// 设置域名的cookie
String domainName = getDomainName(request);
//System.out.println(domainName);
if (!"localhost".equals(domainName)) {
cookie.setDomain(domainName);
}
}
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}


不设置MaxAge,默认响应会话Cookie(MaxAge<0),存在浏览器内存。Cookie随浏览器关闭而消失
设置特定Cookie的MaxAge=0,则会删除已经存在客户端的此Cookie
==============
==============
已经可以解释下面的问题:

为什么浏览器关闭代表一次会话结束?
关闭时发生了什么操作导致会话结束?
为什么那个操作执行意味着会话结束?

一般,响应给客户端的Cookie都是会话Cookie(不设置MaxAge),是存在浏览器内存中的。所以关闭浏览器后,内存中Cookie就消失了。Cookie消失,则下次请求服务器时,请求头中不存在代表用户信息的Cookie(唯一标识用户,表示其状态),那么浏览器就无法识别请求的用户。

根据我们上面反向推导的结论:当服务器无法断定客户端时,一次会话就结束了!

===================================
===================================

session和cookie的区别:
1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session 因此,维持一个会话的核心就是客户端的唯一标识,即 session id





Token
HTTP请求都是以无状态的形式对接。即HTTP服务器不知道本次请求和上一次请求是否有关联。所以就有了Session的引入,即服务端和客户端都保存一段文本,客户端每次发起请求都带着,这样服务器就知道客户端是否发起过请求。

这样,就导致客户端频繁向服务端发出请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否。而Session的存储是需要空间的,频繁的查询数据库给服务器造成很大的压力。

在这种情况下,Token应用而生。

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌。当客户端第一次访问服务端,服务端会根据传过来的唯一标识userId,运用一些算法,并加上密钥,生成一个Token,然后通过BASE64编码一下之后将这个Token返回给客户端,客户端将Token保存起来(可以通过数据库或文件形式保存本地)。下次请求时,客户端只需要带上Token,服务器收到请求后,会用相同的算法和密钥去验证Token。

最简单的Token组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,由Token的前几位+盐以哈希算法压缩成一定长的十六进制字符串,可以防止恶意第三方拼接Token请求服务器)。

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录
服务端收到请求,去验证用户名与密码
验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者数据库里
客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
APP登录的时候发送加密的用户名和密码到服务器,服务器验证用户名和密码,如果成功,以某种方式比如随机生成32位的字符串作为Token,存储到服务器中,并返回Token到APP,以后APP请求时,凡是需要验证的地方都要带上该Token,然后服务器端验证Token,成功返回所需要的结果,失败返回错误信息,让他重新登录。

对于同一个APP同一个手机当前只有一个Token;手机APP会存储一个当前有效的Token。其中服务器上Token设置一个有效期,每次APP请求的时候都验证Token和有效期。

下面这个例子,可以很好的理解:

『给我来份煎饼(token我是你对面摊卖烤冷面的,scope赊账)』『好』
『鸡蛋(token我是你对面摊卖烤冷面的,scope赊账)』『好』
『再加个鸡蛋(token我是你对面摊卖烤冷面的,scope赊账)』『好』

最终得到一份普通煎饼,外加两个鸡蛋……

如果服务器重启或者因为其他理由,服务器端已保存token丢失。那么用户需 要重新登录和认证。

『给我来份煎饼(token我是你对面摊卖烤冷面的)』『那个……我没见过你』
==========================
==========================
google了一下,发现DES,cookie,MD5都有工具类
任务5过程:
1.先建user数据表,然后使用generrator代码生成
2.写DES,cookie,MD5都有工具类
3.写user的controller,用post,需要返回登录页面。
4.写登录页面
5.了解拦截器,设置拦截器









返回列表 返回列表
评论

    分享到