Cookies和Session理论总结
今天主要学习了Cookies和Session,网络上关于这方面的知识可谓很多,让人眼花缭乱,在此作一个小结。本文不讲多,不讲什么高大上的,只是抛出一块砖,讲三个问题:①什么是Cookies和Session?②为什么要用Cookies和Session;③Session什么情况下被销毁。下一篇文章将以Java为例,简单实践一下。
1. 什么是Cookies,什么是Session?
关于这两个概念,很多文章都会给你来一长串定义,balabala一大堆。其实我个人认为这两个东东本质上做了一件事情——记录用户数据(也就是一小段文本)!!!比如,我们登陆论坛的时候,都是自动登陆的,这些数据就是以Cookies或Session方式给你记录下来的。那这两个东东有什么区别呢?最根本的:Cookies是由服务器生成,发送给客户端浏览器,由浏览器保存;Session则保存在服务器端,当然,服务器上有许多Session对象,怎么索引,这里会生成Session ID,以Cookies的方式发送给客户端,之后请求,服务器端就根据Session去索引Session对象,从而获取所需信息。
关于Cookies结构及相关知识,见参考文献:[2]。
关于Cookies和Session更多描述,见参考文献:[1]。
2. 为什么要用这两个东东?
个人理解:主要是为了方便用户使用,提升用户体验;如果被一些流氓公司利用,做了一些不道德的事,这也让我们很头疼,我们只能禁用Cookies了。。。^_^。
3. Session什么时候会被销毁?
Session,中文翻译为会话,顾名思义,我以为Session对象是在访问网站建立,在退出网站是销毁的。其实我错了!其实用户退出浏览器或退出网站,虽然session ID可能找不到了(注意我这里用的是可能,假设Session ID以Cookies方式给客户端保存,并且设定了MaxAge(最大有效时间),则SessionID将会保存到硬盘上,这样Session ID仍然存在),但是服务器上Session对象仍然存在。只有下述三种情况会使session对象被删除:
- 服务端程序主动删除,即调用HttpSession.inValidate()函数;
- 距离上一次收到客户端发送session ID的时间间隔超过session的最大有效时间;(哦,Session也是有有效时间的啊!!!)
- 服务器进程被停止。
所以,大家别被Session这个名字给误导了~一次会话结束,不会把服务器上的Session对象删掉的。
最后提一下:
本文讲的都是一些个人理解,或者在阅读一些知识后的总结,可能有错,请帮忙指出,谢谢;
关于Cookies,Session其他理论问题,都可以参考文献[1],不想再抄袭;
关于在Java中,Cookies怎么使用,怎么创建、怎么设置值、Session怎么创建、怎么设置值,等等,这些我们准备下一文具体实践一下。
附:参考文献
[1] cookie、session及实现记住密码,自动登录: http://blog.163.com/xiexueyong1987@126/blog/static/126267342201031993557704/
[2] Java之Cookie详解:http://www.cnblogs.com/z941030/p/4742188.html
上述内容编辑于2015-08-19
下述内容编辑于2015-08-23
Cookies和Session都是用于保存用户状态数据的。上次我们最后说,准备在JSP下实验以下,下面我们嵌入到JSP中的代码如下:
1 <% 2 // 若请求对象中有Cookies,且有用户名和密码的Cookies,则将其写入到 3 // 字符串中,以便后续显示在输入框中。 4 String userName = "", password = ""; 5 boolean isAutoLogin = false; 6 request.setCharacterEncoding("UTF8"); 7 Cookie[] cookies = request.getCookies(); 8 for (int i = 0; cookies != null && i < cookies.length; ++i) { 9 if (cookies[i].getName().equals("userName")) { 10 userName = cookies[i].getValue(); 11 } 12 13 if (cookies[i].getName().equals("password")) { 14 password = cookies[i].getValue(); 15 } 16 17 if (cookies[i].getName().equals("autoLogin")) { 18 isAutoLogin = cookies[i].getValue().equals("on"); 19 } 20 } 21 22 if (isAutoLogin == true) { 23 if (userName.equals("lijihong") && password.equals("123456789")) { 24 %> 25 <jsp:forward page="/IndexAuto.jsp"></jsp:forward> 26 <% 27 } 28 } 29 else { 30 // 若请求参数中有userName和password,则将它们放到回复对象中。 31 String userNameParam = request.getParameter("userName"); 32 String passwordParam = request.getParameter("password"); 33 String autoLoginParam = request.getParameter("autoLogin"); 34 35 if (userNameParam != null && !userNameParam.equals("")) { 36 Cookie cookie = new Cookie("userName", userNameParam); 37 response.addCookie(cookie); 38 } 39 40 if (passwordParam != null && !passwordParam.equals("")) { 41 Cookie cookie = new Cookie("password", passwordParam); 42 response.addCookie(cookie); 43 } 44 45 if (autoLoginParam != null && autoLoginParam.equals("on")) { 46 Cookie cookie = new Cookie("autoLogin", autoLoginParam); 47 cookie.setMaxAge(14 * 24 * 60 * 60); 48 response.addCookie(cookie); 49 } 50 51 if (userNameParam != null && 52 userNameParam.equals("lijihong") && 53 passwordParam != null && 54 passwordParam.equals("123456789")) { 55 %> 56 57 <jsp:forward page="/Index.jsp"></jsp:forward> 58 59 <% 60 } 61 }%>
上述代码写的是Cookies数据的保存和使用,Session是类似的,就不再重复了。注意,代码中自动登录和手动登录跳转页面不一样是为了在实验中区分两种登录方式。