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

javawebday0712(ServletCookie)

会话什么是会话?会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器&

会话
  • 什么是会话?
    • 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
  • 会话过程中要解决的一些问题?
    • 每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
    • 例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。
    • 思考:用户购买的商品保存在request或servletContext中行不行?





保存会话数据的两种技术
在多个会话过程中多个web资源之间实现数据共享:

  • COOKIE
    • COOKIE是客户端技术,程序把每个用户的数据以COOKIE的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
  • Session
    • Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。





COOKIE技术






Session技术







COOKIE API
  • javax.servlet.http.COOKIE类用于创建一个COOKIE,response接口中也定义了一个addCOOKIE方法,它用于在其响应头中增加一个相应的Set-COOKIE头字段。同样,request接口中也定义了一个getCOOKIEs方法,它用于获取客户端提交的COOKIE。
  • COOKIE类的方法:
    • public COOKIE(String name,String value)
    • setValue与getValue方法,设置和获取COOKIE的值
    • setMaxAge与getMaxAge方法,设置COOKIE的有效期,默认为整个会话过程,关掉浏览器就销毁。
    • setPath与getPath方法 ,设置和获取访问服务器的有效路径,例如:/day06,只会在访问服务器的day06下面的web资源的时候才会带COOKIE来。
    • setDomain与getDomain方法,设置和获取服务器的有效域名,例如:.sina.com
    • getName方法 




  • 要明白三点:怎么把数据用COOKIE进行封装、怎么把COOKIE打给浏览器、怎么获取浏览器带过来的COOKIE?
    • 用COOKIE的构造方法进行封装数据到COOKIE
    • 用Response的addCOOKIE()方法,将COOKIE打给浏览器。
    • 用Request的getCOOKIEs()方法,获取浏览器带过来的所有COOKIE。



COOKIE应用:显示用户上次访问时间

package cn.mengmei.COOKIE;import java.io.IOException;
import java.util.Date;import javax.servlet.ServletException;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class COOKIEDemo1 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取浏览器带过来的名为lastDate的COOKIECOOKIE[] COOKIEs = request.getCOOKIEs();String lastDate = "";if(COOKIEs != null){for(COOKIE cook : COOKIEs){if(cook.getName().equals("lastDate")){lastDate = cook.getValue();}}}//将时间打印到浏览器显示response.setContentType("text/html;charset=UTF-8");response.getWriter().write("上次访问时间:"+lastDate);//最新时间值String newTime = new Date(System.currentTimeMillis()).toLocaleString();//将当前时间封装到COOKIE,设置有效期为30天。COOKIE COOKIE = new COOKIE("lastDate", newTime);COOKIE.setMaxAge(30*24*3600);  //设置为0,可以将该COOKIE从硬盘删掉。//没有设置有效path,默认是本Servlet所在目录: /myday07/servlet//必须在本Servlet所在目录 /myday07/servlet 下的Servlet才能够将此COOKIE删除。//假如你在这里设置了有效目录,那么在你删的时候也必须设置相同的有效目录才能够删除。//将COOKIE打给浏览器response.addCOOKIE(COOKIE);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}


浏览器地址栏输入:http://localhost:8080/myday07/servlet/COOKIEDemo1

第一次访问没有时间值,第二次访问显示第一次访问的时间,浏览器关掉再打开还能显示:

上次访问时间:2015-2-12 23:05:23




COOKIE的细节
  • 一个COOKIE只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个WEB站点可以给一个WEB浏览器发送多个COOKIE,一个WEB浏览器也可以存储多个WEB站点提供的COOKIE
  • 浏览器一般只允许存放300COOKIE,每个站点最多存放20COOKIE,每个COOKIE的大小限制为4KB
  • 如果创建了一个COOKIE,并将他发送到浏览器,默认情况下它是一个会话级别的COOKIE(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该COOKIE存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该COOKIE
  • 注意,删除COOKIE时,path必须一致,否则不会删除



COOKIE应用:显示用户上次浏览过的商品



实现过程:



显示商品列表的首页Servlet:

package cn.mengmei.COOKIE;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MainServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");//联合使用以下三个响应消息头,控制浏览器不要缓存。response.setHeader("Expires", "-1"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); PrintWriter out = response.getWriter();out.write("JSP教程 张孝祥
");out.write("HTML+CSS+JS 雷拓
");out.write("JAVA就业教程 王山海
");out.write("structs框架从入门到精通
");out.write("Windows编程 MFC


");out.write("您最近浏览过的历史记录:
");COOKIE[] COOKIEs = request.getCOOKIEs();if(COOKIEs!=null){for(COOKIE cook : COOKIEs){if(cook.getName().equals("bookHistory")){String history = cook.getValue();String[] ids = history.split(",");for (String id : ids) {switch (id) {case "1":out.write("JSP教程 张孝祥
");break;case "2":out.write("HTML+CSS+JS 雷拓
");break;case "3":out.write("JAVA就业教程 王山海
");break;case "4":out.write("structs框架从入门到精通
");break;case "5":out.write("Windows编程 MFC
");break;default:break;}}}}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


详细页面:

package cn.mengmei.COOKIE;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;import javax.servlet.ServletException;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DetailServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");String id = request.getParameter("id");boolean flag = true;COOKIE[] COOKIEs = request.getCOOKIEs();if(COOKIEs!=null){for(COOKIE cook : COOKIEs){if(cook.getName().equals("bookHistory")){flag = false;String history = cook.getValue();if(!history.contains(id)){StringBuilder sb = new StringBuilder(history);sb.insert(0, id+",");history = sb.toString();System.out.println(history);cook.setValue(history);cook.setMaxAge(30*24*3600);response.addCOOKIE(cook);}else{history = history.replaceAll("["+id+"]", "");StringBuilder sb = new StringBuilder(history);sb.insert(0, id+",");history = sb.toString();history = history.replaceAll("\\W*(\\W{1})", "$1");while(history.startsWith(",")){history = history.substring(1);}while(history.endsWith(",")){history = history.substring(0, history.length()-1);}System.out.println(history);cook.setValue(history);cook.setMaxAge(30*24*3600);response.addCOOKIE(cook);}}}if(flag){COOKIE COOKIE = new COOKIE("bookHistory", id);COOKIE.setMaxAge(30*24*3600);response.addCOOKIE(COOKIE);}}else{COOKIE COOKIE = new COOKIE("bookHistory", id);COOKIE.setMaxAge(30*24*3600);response.addCOOKIE(COOKIE);}PrintWriter out = response.getWriter();switch (id) {case "1":out.write("JSP教程 张孝祥---详细信息页面。。。。。。。。。。。");break;case "2":out.write("HTML+CSS+JS 雷拓---详细信息页面。。。。。。。。。。。");break;case "3":out.write("JAVA就业教程 王山海---详细信息页面。。。。。。。。。。。");break;case "4":out.write("structs框架从入门到精通---详细信息页面。。。。。。。。。。。");break;case "5":out.write("Windows编程 MFC---详细信息页面。。。。。。。。。。。");break;default:break;}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}


浏览器地址栏输入:http://localhost:8080/myday07/servlet/MainServlet

效果:



老师讲的标准代码:

package cn.mengmei.COOKIE;import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;import javax.servlet.ServletException;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MainServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//显示商品列表response.setContentType("text/html;charset=UTF-8");response.setHeader("Expires", "-1"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); PrintWriter out = response.getWriter();out.write("首页图书展示:
");Map map = DB.getAll();Set> set = map.entrySet();for(Map.Entry me : set){Book book = me.getValue();String name = book.getName();String id = book.getId();out.write(""+name+"
");}out.write("
");//最近浏览out.write("最近浏览:
");COOKIE[] COOKIEs = request.getCOOKIEs();String bookHistory = null;for(int i=0; COOKIEs!=null && i");}}}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}class DB{private static Map map = new LinkedHashMap();static{map.put("1", new Book("1","javaweb教程","张孝祥","一本好书!"));map.put("2", new Book("2","structs精通","黎活明","很棒!"));map.put("3", new Book("3","Hibernate教程","方立勋","哈哈好书!"));map.put("4", new Book("4","Spring讲解","刘云山","好书书书!"));}public static Map getAll(){return DB.map;}
}class Book{private String id;private String name;private String author;private String descrip;public Book() {super();}public Book(String id, String name, String author, String descrip) {super();this.id = id;this.name = name;this.author = author;this.descrip = descrip;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public String getDescrip() {return descrip;}public void setDescrip(String descrip) {this.descrip = descrip;}
}


package cn.mengmei.COOKIE;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;import javax.servlet.ServletException;
import javax.servlet.http.COOKIE;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class DetailServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//根据id显示商品详细信息response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.write("商品详细:
");String id = request.getParameter("id");Book book = (Book) DB.getAll().get(id);out.write("id:"+book.getId()+"
");out.write("书名:"+book.getName()+"
");out.write("作者:"+book.getAuthor()+"
");out.write("描述:"+book.getDescrip()+"
");//给浏览器端发送COOKIECOOKIE COOKIE = new COOKIE("bookHistory", makeHistory(request,id));COOKIE.setMaxAge(30*24*3600);response.addCOOKIE(COOKIE);}private String makeHistory(HttpServletRequest request, String id) {COOKIE[] COOKIEs = request.getCOOKIEs();String bookHistory = null;for(int i=0; COOKIEs!=null && i link = new LinkedList();if(bookHistory != null){String[] ids = bookHistory.split("\\_");link.addAll(Arrays.asList(ids));if(link.contains(id)){link.remove(id);}link.addFirst(id);while(link.size() > 3){link.removeLast();}}else{link.add(id);}StringBuilder sb = new StringBuilder();for(String i : link){sb.append(i+"_");}sb.deleteCharAt(sb.length()-1);return sb.toString();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}









推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 找到JDK下载URL当然去官网找了。目前最新的1.8的下载URL(RPM)如下:http:download.oracle.comotn-pubjavajdk8u161-b122f3 ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • IamgettingaUnicodeerror:UnicodeEncodeError:charmapcodeccantencodecharacteru\xa9in ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • angular.element使用方法及总结
    2019独角兽企业重金招聘Python工程师标准在线查询:http:each.sinaapp.comangularapielement.html使用方法 ... [详细]
author-avatar
甜甜deX
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有