标签:font 二次 word xxxx sid 时间服务 一点 自己的 附加
在计算机网中常常会听到这两个专业术语,一般简单的认识是Cookie可以保存用户登陆某个网站的账号和密码,Session最经典的就是保存购物车中的信息,这一点认识肯定是很肤浅的。
这里我采集了网上我个人认为讲授的非常好的大佬们的几个观点。
1. 由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。
2. 思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
3. Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。所以,总结一下:Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。
4.如果cookie里的sessionid被其他人发现了,比如连了不安全的 Wi-Fi ,Cookie 可能会被窃取,然后模拟用户操作。
5.有人疑问:既然session还是需要用到cookie,那为什么不直接就用cookie来识别用户呢。貌似是因为cookies明文保存,非常不安全。而且cookies只能保存文本,长度有限,session保存在服务器端相对安全而且可以存储非常多的内容
http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。
大家请看在HTTP请求报文头的最后一行有cookie,不过是JSessionID的cookie值
Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C
比如前两个值,应该属于偏好设置之类的。
服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。
明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如 session cookie安全了。
通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。
在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,session cookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。
http://qzone.qq.com/
http://lavasoft.blog.51cto.com/62575/275589 深入理解HTTP Session
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
// 得到用户名和密码,验证
String u = request.getParameter("username");
String p = request.getParameter("password");
UserBeanBO ubb = new UserBeanBO();
if (ubb.checkUser(u, p))
{
// 1.把成功登陆的用户所有信息放入session
UserBean ub = ubb.getUserBean(u);
request.getSession().setAttribute("userInfo", ub);
// 2.把购物车的信息取出
MyCartBO mcb = (MyCartBO)request.getSession().getAttribute("mycart");
ArrayList al = mcb.showMyCart();
// 把al放入request
request.setAttribute("mycartInfo", al);
// 用户合法
request.getRequestDispatcher("success.jsp").forward(request,response);
} else
{
// 用户不合法
request.getRequestDispatcher("error.jsp").forward(request, response);
}
}
HttpSession javax.servlet.http.HttpServletRequest.getSession()
Returns the current session associated with this request, or if the request
does not have a session, creates one.
Returns: the HttpSession associated with this request
See Also:
getSession(boolean)
标签:font 二次 word xxxx sid 时间服务 一点 自己的 附加
原文地址:http://www.cnblogs.com/zhangmingzhao/p/7613141.html