【JavaWeb】会话技术Cookie和Session学习总结 您所在的位置:网站首页 javaweb总结 【JavaWeb】会话技术Cookie和Session学习总结

【JavaWeb】会话技术Cookie和Session学习总结

2023-07-22 22:43| 来源: 网络整理| 查看: 265

JavaWeb学习小结Cookie和Session

文章目录 1.了解会话2.Cookie和Session2.1为什么要用Cookie和Session呢?2.2 Cookie2.2.1 怎样操作Cookie2.2.2 Cookie中存取空格或中文2.2.3 Cookie常见问题及解决 2.3 Session2.3.1 理解session机制2.3.2 怎样操作Session2.3.3 用户浏览器可能会禁用或者不支持Cookie的情况 3.总结Cookie和Session的关系4.Cookie和Session的应用

1.了解会话

Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。      一次会话指的是:就好比打电话,A给B打电话,接通之后,会话开始,直到挂断电话,该次会话就结束了,而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,其中不管浏览器发送多少请求(就相当于接通电话后说话一样),都视为一次会话,直到浏览器关闭,本次会话结束。其中注意,一个浏览器就相当于一部电话,如果使用火狐浏览器,访问服务器,就是一次会话了,然后打开google浏览器,访问服务器,这是另一个会话,虽然是在同一台电脑,同一个用户在访问,但是,这是两次不同的会话。

2.Cookie和Session

说到Cookie和Session先从二者的英文单词含义说起,Cookie翻译为中文是小饼干的意思,Session翻译成中文是会话的意思。从翻译就能看出来,Cookie是服务器返回给浏览器的一些断断续续的东西,而Session是一种会话机制。

2.1为什么要用Cookie和Session呢? 因为Http协议是一种无状态协议,服务端需要记录用户的状态时,就需要用某种机制来识别具体的用户,这个机制就是Session,而session是如何实现状态保持的呢?这个时候Cookie作用就体现出来了!每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session要借助Cookie技术来传递ID属性的. 2.2 Cookie

Cookie是客户端技术,程序把每个用户的数据以Cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。我们通一个图能直观了解Cookie实现原理: 在这里插入图片描述 Cookie的内容主要包括:名字,存储数据(值),作用时间(过期时间),作用范围(路径和域),性能。

Cookie主要内容定义Cookie是服务端给客户端的数据,数据存储于客户端(浏览器),即本地,如IE浏览器把Cookie信息保存在类似于C:\windowsCookies的目录下。所以Cookie在客户端可以编辑伪造,并不是十分安全名字在创建一个Cookie时,我们给定Cookie名存储数据只能存储 String 类型的对象(中文或者空格需要转码)作用时间Cookie可以通过 setMaxAge()方法,(后面介绍),设置过期时间,如果不设置过期时间,则表示这个Cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,Cookie就消失了。这种生命期为浏览器会话期的Cookie被称为会话Cookie。会话Cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把Cookie保存到硬盘上,关闭后再次打开浏览器,这些Cookie仍然有效直到超过设定的过期时间。作用范围Cookie通过设置指定作用域,只能在指定作用域有效。默认Cookie只对当前访问路径所属的目录及其子目录有效。性能Cookie存在客户端对服务器没影响 2.2.1 怎样操作Cookie

我们用代码来介绍操作Cookie的API:

//创建一个Cookie Cookie cookie = new Cookie("mycookie", "first cookie");//左边参数为cookie名,右边参数为cookie值 //取得Cookie的名字 cookie.getName(); //设置Cookie的值 cookie.setValue("rename second cookie"); //取得Cookie的值 cookie.getValue(); //设置Cookie的最大保存时间,不设置cookie的过期时间默认为-1,表示关闭浏览器即结束生命 cookie.setMaxAge(1*60*60*24);//24小时失效,(单位为s) //获取Cookies的有效期 cookie.getMaxAge(); //设置在某个域名下生效 cookie.setDomain("localhost");//默认为localhost //获取cookie的有效域 cookie.getDomain(); /*设置cookie的有效路径, 比如把cookie的有效路径设置为"/xdp", 那么浏览器访问"xdp"目录下的web资源时,都会带上cookie, 再比如把cookie的有效路径设置为"/xdp/gacl", 那么浏览器只有在访问"xdp"目录下的"gacl"这个目录里面的web资源时才会带上cookie一起访问, 而当访问"xdp"目录下的web资源时,浏览器是不带cookie的*/ cookie.setPath("/");//默认为 / ,对该站点的所有目录下的访问路径都有效 //获取cookie的有效路径 cookie.getPath(); //删除cookie,注意:删除cookie时,path必须一致,否则不会删除 cookie.setMaxAge(0);//将cookie的有效期设置为0,命令浏览器删除该cookie //添加到response response.addCookie(cookie); //获取cookies Cookie[] cookies=request.getCookies(); //cookies内的值拿出,通过判断cookie的名字拿到值 //cookie内的值拿出 String lastTime=null; //不为空则读出来 if (cookies!=null && cookies.length>0){ for(Cookie cookieNew:cookies){ String cookieRequestName=cookieNew.getName(); if ("lastTime".equals(cookieRequestName)){ lastTime=cookieNew.getValue(); break; } } } 2.2.2 Cookie中存取空格或中文

要想在cookie中存储空格和中文,那么必须使用URLEncoder类里面的encode(String s, String enc)方法进行中文转码。否则会出现异常,报错无法识别。

//设置cookie的内容Value Strking Value="我打了空格 +中文我"; //进行转码 Value=URLEncoder.encode(Value, "UTF-8"); //创建cookie Cookie cookie = new Cookie("mycookie",Value); //发送cookie response.addCookie(cookie);

在获取Cookie中的中文和空格数据时,再使用URLDecoder类里面的decode(String s, String enc)进行解码。

URLDecoder.decode(cookies.getValue(), "UTF-8"); 2.2.3 Cookie常见问题及解决

Cookie常见问题及解决:共享问题cookie.setpath()详解.

2.3 Session

之前我们介绍的Cookie是把用户的身份信息存在了客户端,而Session说白了就是把用户的信息(状态)保存在了服务端。

2.3.1 理解session机制

原理图 在这里插入图片描述

Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构来保存信息。

当程序需要为某个客户端的请求创建一个Session的时候,服务器首先检查这个客户端的请求里是否已包含了一个Session标识称为Session ID,如果已包含一个Session ID则说明以前已经为此客户端创建过Session,

服务器就按照Session ID把这个Session检索出来使用,如果客户端请求不包含Session ID,则为此客户端创建一个Session并且生成一个与此Session相关联的Session ID,它的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session ID将被在本次响应中返回给客户端保存。 保存这个Session ID的方式可以采用Cookie,这样在会话过程中客户端(浏览器)可以自动的按照规则把这个Session ID发送给服务器。

所以当客户端(浏览器)关闭,就再也访问不到之前的Session ID了,Session要借助Cookie技术来传递ID属性的,但是还可以访问之前创建的Session 。

Session的主要内容:存储数据(值),作用时间(过期时间),作用范围(路径和域),性能

Session主要内容定义Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的Session对象,由于Session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的Session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的Session中取出数据为用户服务。存储数据能够存储任意的 java 对象作用时间由于Session是保存在了服务端,所以当用户关闭浏览器时Session并不会消失。一般Session保存在服务器的内存中,当然也可以持久化到硬盘或者数据库中。Session的默认过期时间是30分钟,过期的Session会被服务器自动的销毁。注意如果大量的创建Session可能导致服务器的内存溢出。作用范围Session在整个网页都有效性能Session过多时会消耗服务器资源,大型网站会有专门Session服务器 2.3.2 怎样操作Session

我们用代码来介绍Session常用方法:

//获取session,没有则创建 HttpSession session = request.getSession(); //获取SessionId session.getId() //获取存储的某个值 session.getAttribute("key"); //存储数据,value是object类型 session.setAttribute("key","value"); //设置会话的过期时间(单位:秒),默认30分钟 session.setMaxInactiveInterval(1*60*60); //获取session创建的时间 session.getCreationTime(); //获取最后一次修改session的时间 session.getLastAccessedTime() //移除某个数据 session.removeAttribute("key"); //重置session,使session失效 session.invalidate(); 2.3.3 用户浏览器可能会禁用或者不支持Cookie的情况

当浏览器不支持Cookie或者关闭了Cookie 功能时,在会话过程中,如果想 让Web服务器可以保存用户的信息,必须对所有可能被客户端访问的请求路径进 行URL重写。在HttpServletResponse接口中,定义了两个用于完成URL重写的方法。

response.encodeRedirectURL(java.lang.String url) //用于对sendRedirect方法后的url地址进行重写。 response.encodeURL(java.lang.String url) //用于对表单action和超链接的url地址进行重写

URL重写,指的是将Session的会话标识号以参数 的形式附加在超链接的URL地址后面。对于Tomcat服务器来说,就是将JSessionID关键字作为参数名以及会话标识号的值作为参数值附加到URL地址 后面。具体使用:

public class IndexServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); //创建Session request.getSession(); out.write("本网站有如下书:"); Set set = DB.getAll().entrySet(); for(Map.Entry me : set){ Book book = me.getValue(); String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId(); //response. encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写 newurl = response.encodeURL(url);//将超链接的url地址进行重写 out.println(book.getName() + " 购买"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }

当浏览器禁用了Cookie后,就可以用URL重写这种解决方案解决Session数据共享问题。而且response. encodeRedirectURL(java.lang.String url)和response. encodeURL(java.lang.String url)是两个非常智能的方法,当检测到浏览器没有禁用Cookie时,那么就不进行URL重写了。

3.总结Cookie和Session的关系 Cookie是服务端给客户端的数据,客户端保存用户信息的一种机制,存在于客户端。Session是在服务端保存的一个数据结构,会响应给Cookie一个Session ID的记录,它是基于Cookie的一种机制。Session通过服务器向浏览器发送一个具有SessionId的会话Cookie来给用户一个身份标识,在浏览器没有关闭的情况下,会话Cookie(Sessionid)一直存在,服务器中Session的数据也一直存在。一旦浏览器关闭,浏览器的会话Cookie(Sessionid)会消亡,但服务器中的Session仍然存在,只有消亡倒计时结束或者调用了Session.invalidate();服务器中的Session才会消亡。Cookie的安全性不高,存储在本地,总存储量也只有4kb,浏览器会限制最多Cookie数,可能禁用Cookie。Session的安全性较高,总存储量很高,由于数据存储在服务器中,无需加密,但对一个网页来说具有唯一性。 4.Cookie和Session的应用

Cookie和Session简单应用情景.

欢迎点赞评论,指出不足,笔者由衷感谢哦!~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有