深入浅出seesion和cookie

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学习,未完待续......

时间: 2024-08-11 09:52:24

深入浅出seesion和cookie的相关文章

[py]http的seesion和cookie机制

cookie和session是怎么回事? Cookie是HTTP协议中的一种会话机制.也明白下面两个问题就好了 1.What 什么是Cookie 2.How Cookie怎么用,干嘛用 原理图 交互过程 ① 客户端访问,无服务端写入的Cookie ② 服务端的Cookie写入浏览器 ③ 浏览器解析Cookie,保存至浏览器文件 ④ 客户端访问,有服务端写入的Cookie ⑤ 服务器获取 浏览器端的cookie-字典格式,kv格式 原文地址:https://www.cnblogs.com/iiii

深入浅出,解析cookie与session

一.session和cookie的特征 很多人认为,session是服务端的,cookie是客户端的.其实呢,session和cookie都是服务器产生的,都是键值对应的. ** session是保存在服务器的,服务器会生成对应的session文件,cookie是返回给客户端的,然后客户端在存储相关文件.** session在服务器的入口是ID,然后服务器查出对应的的值,通过类似cookie的形式,返回给客户端(相当于买电影票).客户端(浏览器),会在发送请求的时候,自动将本地存活的cookie

关于Cookie的有关内容

1.首先谈谈http协议与状态保持. Http协议本身是无状态的,这与http协议本来的目的是相符的,客户端只需要简单的向服务器发出请求操作,然后服务器对请求作出响应.无论客户端还是服务器都没有必要记录彼此的过去的行为,每一次请求之间都是独立的. 不过生活中确实有另外一种需求,比如:某家咖啡店有喝5杯咖啡送一杯的优惠 ,然而一次性消费5杯咖啡的机会微乎其微,这时就需要用一种方式来记录某位顾客消费咖啡的数量.想象一下,其实也就是下面几种情况: 1.该店的店员很厉害,能记住每位顾客的消费数量,只要顾

Application

Application也是可以用于页面间传值的一种方式.Application存储于服务器端,与Seesion最大的不同在于Application可以被访问网站的所有页面所有用户使用. 最常用的例子就是用于统计网站不同身份人访问量. Application跟Seesion于Cookie一样,存值的方式都是键值对的方式. Application[“键”]=值; 变量=(类型转换)Application[“键”]; 代码 登陆界面 protected void click(object a, Eve

Flask框架基础3

目录 线程threading 通过字典实现threading-local(函数) 面向对象版 通过setattr和getattr实现 每个对象有自己的存储空间(字典) 兼容线程和协程(源码到request中去看,看local的__getattr__,setattr) 请求上下文 蓝图 使用蓝图之中小型系统 使用蓝图之大型系统 g对象 flask-session 信号 线程threading from threading import Thread from threading import lo

Flask(二)

一.threading.local 多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储 不用threading.local (多线程资源共享,sleep后执行取到的都是最后一次修改的值) # 不用local from threading import Thread import time cxw = -1 def task(arg): global cxw cxw = arg # time.sleep(2) print(cxw) ? for i in range

破解网络投票IP限制、验证码限制、COokie限制、Seesion限制的方法!(转)

顾名思义,网络投票就是在网络上进行的投票活动,但和其他类型的投票不同的是:网络投票是建立在网络投票系统上的,而结果完全由程序输出,无需人工参与.这既是网络投票系统的优点也是其缺点,没有了人工的参与,其结果很可能被黑客利用.而网络投票系统本身的技术含量并不高,对于连续投票的验证能力薄弱,只要黑客掌握了原理,就可以轻松地实现连续刷票,对投票结果进行作弊.那么,黑客是如何突破网络投票系统的,又是如何实现无限制刷票的呢?下面我们就来对此进行揭密. 网络投票的验证方式 参与过网络投票活动的朋友都知道,当我

cookie,seesion学习

一,为什么需要cookie和session? 1,Web应用程序是使用HTTP协议传输数据的.然而HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接.这就意味着服务器无法从连接上跟踪会话.即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了.所以要跟踪该会话,必须引入一种机制. 2,Cookie和 Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决

Cookie seesion 赋值

后台赋值: Session["uid"] = userid;//后台 后台取值: Label1.Text = Session["userid"].ToString(); //1.前台 赋值 document.cookie = 'caller=' + Caller;// cookie保存一个值 //2.接收值 var caller = document.cookie; caller = caller.split("=")[1];//根据指定字符拆分