深入浅出seesion和cookie-阿里云开发者社区

开发者社区> 开发与运维> 正文

深入浅出seesion和cookie

简介: session在计算机中,尤其是在网络应用中,称为“会话控制”。session 对象存储特定用户会话所需的属性及配置信息。session跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。

session在计算机中,尤其是在网络应用中,称为“会话控制”。session 对象存储特定用户会话所需的属性及配置信息。session跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与session。Cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份。今天这篇博文,小编主要简单的介绍一下session和cookie,还请各位大神多多指教。

session的基本原理
小伙伴们都知道cookie是存在客户端的,session是存到服务端的,如果存到session整个空间里,只要这个用户没有关闭浏览器,都能从服务器上取得设置的值,如果重新启动浏览器就没有了,seesion是一个会话,一个会话可以看作是一个人,那么她就和这个人进行了绑定,对应这个浏览器,所以人和浏览器就进行了绑定,如下图:


结合上面的图形,小编来详细的介绍一下,假如张三是一个人,且张三是一个客户端,张三要访问我们的服务器(目前我们使用的服务器是tomcat),当张三来访问的时候,我们在tomcat上开辟一个资源或者说开辟一个空间给张三,更准确的说,就是分配一块内存给张三,ok,这个时候,张三就可以进行访问了,张三可以向内存里面存入资源,只要浏览器没有进行关闭的操作,这里面的资源张三可以随时进行存的操作,不管访问了多少页面,只要以前存放在这个浏览器里面的资源,张三都可以拿出来,但是如果进行了关闭浏览器的操作,那么这个里面的东西张三就拿不出来了,再次打开浏览器,用张三进行登录,也是取不出来的,所以这块的内容占着内存。那么如果这个时候李四来了,李四也开辟了一个空间,李四把浏览器关闭了,同样的,李四这块也占用了一定的内存,讲解到这里,小编相信,小伙伴们都能理解了,seesion实在服务端的,在tomcat上,cookie是在客户端的,我们在深入一点研究,http这个协议,小伙伴都有所了解,比如我们平常使用的通讯工具QQ,她可以检测到对方在不在线,比如张三发了一个消息给李四,李四回复了张三的消息,那么问题来了,张三是如何找到李四的呢?张三肯定要知道李四的地址,这样张三和李四才能相互找到对方,而http协议又是怎么回事呢?还是上面的例子来说,假设张三去访问,访问tomcat,tomcat为其开辟了一个空间,之后response进行返回,那下一次访问的时候,张三如何知道他需要找的地方呢?而不是找其他的地方呢?因为这里面有很多的空间,假设有一万个用户,就有一万份内存的分配,怎么样才能知道访问的地方是分配给张三的那块内存呢?是否可以用张三进行标记一下?如果有重复的呢?我们又该怎么办?所以http协议是没有状态的,她不会一直处于连接的状态,如果一直处于连接的状态,张三肯定能找到分配给自己的那块内存,这个request过来,再response过去,就断了,她连接完之后,马上就断,也就是谁都不知道谁的存在了,不像QQ,如果一方下线了,另一方马上知道对方已经不在线了,所以http是无状态的,现在谁都不认识谁了,下次如果再想找这块资源,就找不到,那么我们该怎么办呢?且听小编慢慢道来:

假设张三来进行访问的操作,服务器上为张三分配了一个空间,这个空间属于张三,整个会话都可以用到,所以她叫做session,如果把浏览器关闭,再次启动进行访问的时候,那么就是另外一个会话了,不是这一次的了,当张三来访问的时候,就会创建一个seesionid,所有会有一个标识,这个seesionid是不重复的,创建完编号,做完相关的操作之后,response返回,会把编号也一同带回去,假如这个时候,李四来了,也会为李四创建一个id,访问完成之后,同样会把编号带回去,如下图所示:


所以session有一个超时的概念,如果没有访问,就会被释放。在cookie里面保存了session的id。cookie是可以禁用的,如果浏览器不让我们写cookie了,那怎么办呢,seesion也找不到了,如何解决了,这个时候,我们采用URL重写的方式,什么叫url重写呢?URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求行的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)。
URL重写
URL重写就是首先获得一个进入的URL请求然后把它重新写成网站可以处理的另一个URL的过程。举个例子来说,如果通过浏览器进来的URL是“UserProfile.aspx?ID=1”那么它可以被重写成 “UserProfile/1.aspx”,这样的URL,这样的网址可以更好的被网站所阅读。
如果浏览器不支持Cookie或用户阻止了所有Cookie,可以把会话ID附加在HTML页面中所有的URL上,这些页面作为响应发送给客户。这样,当用户单击URL时,会话ID被自动作为请求行的一部分而不是作为头行发送回服务器。这种方法称为URL重写(URL rewriting)。
一般来说,URL重写是支持会话的非常健壮的方法。在不能确定浏览器是否支持Cookie的情况下应该使用这种方法。然而,使用URL重写应该注意下面几点:
1.如果使用URL重写,应该在应用程序的所有页面中,对所有的URL编码,包括所有的超链接和表单的action属性值。
2.应用程序的所有的页面都应该是动态的。因为不同的用户具有不同的会话ID,因此在静态HTML页面中无法在URL上附加会话ID。
3.所有静态的HTML页面必须通过Servlet运行,在它将页面发送给客户时会重写URL。
url重写有什么缺点呢?对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL。每个引用你的站点的URL,以及那些返回给用户的URL(即使通过间接手段,比如服务器重定向中的Location字段)都要添加额外的信息。这意味着在你的站点上不能有任何静态的HTML页面(至少静态页面中不能有任何链接到站点动态页面的链接)。因此,每个页面都必须使用servlet或JSP动态生成。即使所有的页面都动态生成,如果用户离开了会话并通过书签或链接再次回来,会话的信息都会丢失,因为存储下来的链接含有错误的标识信息-该URL后面的SESSION ID已经过期了。介绍完了session,小编再来简单的介绍一下cookie。
cookie的基本原理
cookie在英文中的意思指的是就这牛奶一起吃的点心,然而,在因特网内,cookie这个字有了完全不同的意思,那么cookie到底是什么呢,cookie是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息,这是很有用的,让浏览器记住这位访客的特定信息,这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置,花费的时间或用户首选项如样式表,cookie是个存储在浏览器目录的文本文件,当浏览器运行时,存储在ram中,一旦从该网站或网络服务器退出,cookie也可存储在计算机的硬驱上,当访客结束其浏览器对话时,即终止的所有所有cookie。
简单来说,cookie的含义是服务器发送给浏览器的甜点,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端,当浏览器再次访问相同的应用时,会将原先的cookie通过请求信息带到服务端,如下面的代码,servlet展示了cookie的功能:
 public void doGet(HttpServletRequest request, HttpServletResponse response)    
                     throws ServletException, IOException {    
          response.setContentType("text/html");    
          PrintWriter out = response.getWriter();    
          String option = request.getParameter("option");    
          if ("show".equals(option)) {    
              //获得请求信息中的Cookie数据    
              Cookie[] cookies = request.getCookies();    
              if (cookies != null) {    
                  //找出名称(键)为“cool”的Cookie    
                  for (int i = 0; i < cookies.length; i++) {    
                      if ("cool".equals(cookies[i].getName())) {    
                          out.println("<h2>" + cookies[i].getName() + ":"    
                              + cookies[i].getValue() + "</h2>");    
                       }    
                  }    
             }    
          } else if ("add".equals(option)) {    
              //创建Cookie对象    
              Cookie cookie = new Cookie("cool", "yeah!");    
              //设置生命周期以秒为单位    
              cookie.setMaxAge(20);    
              //添加Cookie    
              response.addCookie(cookie);    
         } 
cookie可以用于保持用户的会话状态,但是cookie信息保存在客户端,存在较大的安全隐患,且一般浏览器对cookie的数目及其数据大小有严格的限制,在web应用中,一般情况下通过httpSession对象保持会话状态,每个cookie都可以设置一个最大生命周期,如果设置了该值,浏览器将会把该cookie写到硬盘上,但如果没有设置cookie的最大生命周期,这样的cookie成为会话cookie,她存在内存中,当浏览器关闭时,该cookie将会消失。
cookie和session的区别
a、cookie数据存放在客户的浏览器上,session数据存放在服务器上。
b、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用seesion。
c、session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器的性能。
d、单个cookie在客户端的限制是3k,就是说一个站点在客户端存放的cookie不能大于3k。
小编寄语:该博文,小编主要简单的介绍了seesion和cookie、url重写以及session和cookie他们之间的区别。小编介绍的都是一些简单的理论知识,对于session和cookie的具体作用,还需要我们在实际项目中多多的体会。java学习,未完待续......


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章