热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

会话技术cookiesession

0为什么需要会话:传统的客户端服务端交易的数据,可保存在的的的的HttpServletRequest中的和sevletContext对象中。但是当遇到甲

0为什么需要会话:

           传统的客户端服务端交易的数据,可保存在的的的的HttpServletRequest中的和sevletContext对象中。但是当遇到甲发出购买和结账两个不同请求时,HttpServletRequest中的中的中的对象中只保存了结账的请求信息,购买的请求信息将会丢失,因为的的的的HttpServletRequest的的对象只能记录同一次请求的信息(太小了)。使用sevletContext对象保存数据时,由于同一个应用共享的是同一个对象,因此当用户在发送结账请求时,由于无法区分哪些商品是哪些用户所购买的,sevletContext对象会将购物网站中所有用户购买的商品进行计算,这显然是不可行的。为解决这一问题,产生了会话技术。

1.什么是会话:

     从打开一个浏览器访问某个站点(会话开始),到关闭这个浏览器(会话结束)的整个过程,称为一次会话

2.什么是会话技术:      

     会话技术就是记录这次会话中客户端的状态与数据的。

    会话技术分为饼干和会话:    

            饼干:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除饼干

            会议:将数据存储到服务器端,安全性相对好,增加服务器的压力

3,举个例子:

       你(客户端)向我(服务器)借钱(访问服务器),我让你记着(到时还给我就行,但你要忘了,就没办法了 - --------- -----这是饼干

      你(客户端)向我(服务器)借钱(访问服务器),我自己拿个(专门记录你我之间交易的)小本本记着(交易数据存放在服务器端),到时还给我就行,(我会根据我这的记录,知道你有没有少还钱,你也无法赖账,钱还完了,我就更新你还钱的状态了)------------- -----------------这是会议

 

4.实际的饼干案例:显示上次登陆的时间:

当饼干中包含有等号,空格,分号等特殊字符时,可能会导致数据丢失,或者不能解析的错误,一个较好的解决办法就是:在将饼的值写入客户端浏览器之前,首先进行的URLEncode的的的的编码,读取饼干时,进行URLDecode即可。

案例代码如下:

@WebServlet("/hello")
public class ShowLastAccessTime extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获得当前时间Date date = new Date();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String currentTime1 = format.format(date);/* 以上可简写为:// String currenttime=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());//字符串currentTime1中包含空格,存入COOKIE时会报错,// 当COOKIE中包含有等号、空格、分号等特殊字符时,可能会导致数据丢失、// 或者不能解析的错误,一个较好的解决办法就是:在将COOKIE值写入客户端浏览器之前,// 首先进行URLEncode编码,读取COOKIE时,进行URLDecode即可*/String currentTime=URLEncoder.encode(currentTime1, "UTF-8");COOKIE COOKIE=new COOKIE("lastAccessTime",currentTime);//COOKIE.setMaxAge(0);// 设为0,就是清空COOKIE的意思,可用于退出系统COOKIE.setMaxAge(10*60); //设置有效期为60分钟resp.addCOOKIE(COOKIE);String lastAccesstime=null;COOKIE[] COOKIEs=req.getCOOKIEs();if (COOKIEs!=null){for(COOKIE coo:COOKIEs){if("lastAccessTime".equals(coo.getName())){lastAccesstime=coo.getValue();}}}req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf-8");PrintWriter out=resp.getWriter();if (lastAccesstime==null){out.write("第一次访问");} else {String time=URLDecoder.decode(lastAccesstime, "UTF-8");out.write("上次访问时间是:"+time );}}

 

下面是会话讲解:先看图:

一个网络应用,对应一台服务器,多个客户端,多个会议空间(一台服务器需要为每个客户端开辟一个会话存储空间)

客户端访问的服务程序,网络应用是怎么样将客户端与它的会话一一对应起来的呢,解决的方案就是通过设置会话编号(JSESSIONID)

基本概念:

会话技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID(存于饼干中,放在请求头里面进行传输)去服务器中寻找属于自己的内存空间。所以说会话的实现是基于COOKIE的,会话需要借助于的COOKIE存储客户的唯一性标识JSESSIONID

 

  1. 获得会话对象

HttpSession session = request.getSession();

通过请求对象获得当前会话的会话对象,如果服务器端没有该会话的会话对象(无对应的JSESSIONID),则会创建一个新的会话返回,如果已经有了属于该会话的会话(JSESSIONID,即会的唯一标识,是从请求头的设置COOKIE

里面提取出来的),则直接将已有的会话返回(实质就是根据JSESSIONID判断在我的服务器上有没有与你客户端相对的已经存在了会话,即JSESSIONID是否能匹配的上)。

测试代码:

 

servlet1类:

@WebServlet("/session1")
public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session1 = req.getSession();session1.setAttribute("name", "jerry");String id = session1.getId();//该session对象的编号idresp.getWriter().write("JSESSIONID:"+id);}}

servlet2类:

@WebServlet("/session2")
public class Servlet2 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();//从session中获得存储的数据HttpSession session2 = req.getSession();Object attribute = session.getAttribute("name");resp.getWriter().write(attribute+"");}
}

先访问servlet1,在访问servlet2,界面打印出客户名字,但当关闭浏览器,再次访问servlet2时,界面打印为空,因为我们这样的代码有效期是会话级别的。实际上系统默认为我们创建了一个存JSESSIONID的饼干,它的有效期是一次会话的时间(关闭浏览器后,会话结束,保存到本地的存放了JSESSIONID的饼干值也被清空了)

//手动创建一个存储JSESSIONID的COOKIE 为该COOKIE设置持久化时间COOKIE COOKIE = new COOKIE("JSESSIONID",id);COOKIE.setPath("/WEB16/");
//xxx表示一次会话的时间COOKIE.setMaxAge(xxxx);response.addCOOKIE(COOKIE);

我们可以根据需求,手写会议,从而持久化会话

更改后的servlet1代码如下:

@WebServlet("/session1")
public class Servlet1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session1 = req.getSession();session1.setAttribute("name", "jerry");String id = session1.getId();//该session对象的编号id//手动创建一个存储JSESSIONID的COOKIE 为该COOKIE设置持久化时间COOKIE COOKIE = new COOKIE("JSESSIONID",id);/*此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此COOKIE.setPath("/");之后,可以在webapp文件夹下的所有应用共享COOKIE,而COOKIE.setPath("/xxx/");是指以在webapp/xxx文件夹下的所有应用共享COOKIE*/COOKIE.setPath("/wego/");COOKIE.setMaxAge(60*10);resp.addCOOKIE(COOKIE);resp.getWriter().write("JSESSIONID:"+id);}}

这样只要在10分内,及时关掉了浏览器,再次打开,访问servlet2,也能打印出名字

可在web.xml文件中配置会话的有效期:


4320

 


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有