session在计算机中,尤其是在网络应用中,称为“会话控制”。session 对象存储特定用户会话所需的属性及配置信息。session跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是cookie与session。Cookie通过在客户端记录信息确定用户身份,session通过在服务器端记录信息确定用户身份。今天这篇博文,小编主要简单的介绍一下session和cookie,还请各位大神多多指教。
session的基本原理
结合上面的图形,小编来详细的介绍一下,假如张三是一个人,且张三是一个客户端,张三要访问我们的服务器(目前我们使用的服务器是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)。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("