会话技术

什么是会话技术

   基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话.
为什么我们要使用会话技术?

  •   在论坛登陆的时候,很多时候会有一个小框框问你是否要自动登陆,当你下次登陆的时候就不用输入密码了
  •   根据我以前浏览过的商品,猜我喜欢什么商品

Cookie

会话跟踪技术有Cookie和Session,Cookie技术是先出现的。我们先讲Cookie技术吧。
什么是Cookie
  Cookie是由W3C组织提出,最早由netscape社区发展的一种机制
  网页之间的交互是通过HTTP协议传输数据的,而Http协议是无状态的协议。无状态的协议是什么意思呢?一旦数据提交完后,浏览器和服务器的连接就会关闭,再次交互的时候需要重新建立新的连接。
  服务器无法确认用户的信息,于是乎,W3C就提出了:给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie
Cookie的流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个Cookie,浏览器会把Cookie保存起来。当浏览器再次访问服务器的时候,浏览器会把请求的网址连同Cookie一同交给服务器。
Cookie API
  Cookie类用于创建一个Cookie对象
  response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段
  request接口中定义了一个getCookies方法,它用于获取客户端提交的Cookie
  常用的Cookie方法:
    public Cookie(String name,String value)
    setValue与getValue方法
    setMaxAge与getMaxAge方法
    setPath与getPath方法
    setDomain与getDomain方法
    getName方法
简单使用Cookie
  创建Cookie对象,发送Cookie给浏览器、
  记得设置有效期setMaxAge()

  1. response.setContentType("text/html;charset=UTF-8");
  2. Cookie cookie=new Cookie("username", "yolo");
  3. cookie.setMaxAge(1000);
  4. response.addCookie(cookie);
  5. response.getWriter().write("我已向浏览器发送cookie");

Cookie细节
  Cookie不可跨域名性
    浏览器判断一个网站是否能操作另一个网站的Cookie的依据是域名。所以一般来说,当我访问baidu的时候,浏览器只会把baidu颁发的Cookie带过去,而不会带上google的Cookie。即使是同一级域名,不同二级域名也不能交接
  Cookie保存中文
    中文属于Unicode字符,英文数据ASCII字符,中文占4个字符或者3个字符,英文占2个字符。
    解决:Cookie使用Unicode字符时需要对Unicode字符进行编码---------Cookie cookie=new Cookie("username", URLEncoder.encode(name,"UTF-8"));
    取出Cookie的时候要对中文数据进行解码--------
  Cookie的有效期
    如果MaxAge为正数,浏览器会把Cookie写到硬盘中,只要还在MaxAge秒之前,登陆网站时该Cookie就有效【不论关闭了浏览器还是电脑】
    如果MaxAge为负数,Cookie是临时性的,仅在本浏览器内有效,关闭浏览器Cookie就失效了,Cookie不会写到硬盘中。Cookie默认值就是-1。这也就为什么在我第一个例子中,如果我没设置Cookie的有效期,在硬盘中就找不到对应的文件。
    如果MaxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie对应的方法,把MaxAge设置为0等同于删除Cookie
  Cookie的修改和删除
    Cookie的名称相同,通过response添加到浏览器中,会覆盖原来的Cookie。
    删除时也要addCookie
    注意:删除,修改Cookie时,新建的Cookie除了value、maxAge之外的所有属性都要与原Cookie相同。否则浏览器将视为不同的Cookie,不予覆盖,导致删除修改失败!
  Cookie的域名
    Cookie的domain属性决定运行访问Cookie的域名。domain的值规定为“.域名”

    希望同一级域名可以访问------cookie.setDomain(".zhongfucheng.com");
  Cookie的路径
    Cookie的path属性决定允许访问Cookie的路径--------使用Servlet2颁发一个Cookie给浏览器,设置路径为"/Servlet1"。
  Cookie的安全属性
    HTTP协议不仅仅是无状态的,而且是不安全的!如果不希望Cookie在非安全协议中传输,可以设置Cookie的secure属性为true,浏览器只会在HTTPS和SSL等安全协议中传输该Cookie。
    当然了,设置secure属性不会将Cookie的内容加密。如果想要保证安全,最好使用md5算法加密
Cookie的应用
  显示用户上次访问的时间
    其实就是每次登陆的时候,取到Cookie保存的值,再更新下Cookie的值。

  1.      SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2. response.setContentType("text/html;charset=UTF-8");
  3. PrintWriter printWriter=response.getWriter();
  4.  
  5. Cookie[] cookies=request.getCookies();
  6.  
  7. String cookieValue=null;
  8. for(int i=0;cookies!=null&&i<cookies.length;i++){
  9. if(cookies[i].getName().equals("time")){
  10. printWriter.write("您上次登录的时间是");
  11. cookieValue=cookies[i].getValue();
  12. printWriter.write(cookieValue);
  13.  
  14. cookies[i].setValue(simpleDateFormat.format(new Date()));
  15. response.addCookie(cookies[i]);
  16.  
  17. break;
  18. }
  19. }
  20.  
  21. if(cookies==null){
  22. Cookie cookie=new Cookie("time",simpleDateFormat.format(new Date()));
  23. cookie.setMaxAge(2000);
  24. response.addCookie(cookie);
  25. printWriter.write("您是第一次登陆");
  26. }
  27. }

  显示上次浏览过商品

1、新建一个Book类

  1. public class Book {
  2.  
  3. private String id;
  4. private String name;
  5. private String author;
  6.  
  7. public Book(){
  8.  
  9. }
  10.  
  11. public Book(String id,String name,String author){
  12. this.id=id;
  13. this.name=name;
  14. this.author=author;
  15. }
      各种getsetXxx

  2、数据库类DB

  1. public class DB {
  2. private static LinkedHashMap<String, Book> linkedHashMap=new LinkedHashMap<String, Book>();
  3. static{
  4. linkedHashMap.put("1", new Book("1", "javaWeb", "y"));
  5. linkedHashMap.put("2", new Book("2", "Servlet", "o"));
  6. linkedHashMap.put("3", new Book("3", "JSP", "l"));
  7. linkedHashMap.put("4", new Book("4", "SQL", "陈"));
  8. }
  9. public static LinkedHashMap<String, Book> getAll(){
  10. return linkedHashMap;
  11. }
  12. }

  3、首页的代码(读取数据库显示,读取cookies)

  1.     //实现展示书籍并配超链接
  2. response.setContentType("text/html;charset=UTF-8");
  3. PrintWriter printWriter=response.getWriter();
  4. printWriter.write("网页上所有的书籍"+"<br/>");
  5. LinkedHashMap<String,Book> linkedHashMap=DB.getAll();
  6. Set<Map.Entry<String, Book>> entry=linkedHashMap.entrySet();
  7.  
  8. for(Map.Entry<String, Book> stringBookEntry:entry){
  9. Book book=stringBookEntry.getValue();
  10. printWriter.write("<a href='/firstServlet/Demo?id="+book.getId()+"''target=_blank'>"+book.getName()+"</a>");
  11. printWriter.write("<br/>");
  12. }
  13.  
  14. //显示历史记录
  15. printWriter.write("您浏览过的商品有");
  16. printWriter.write("<br/>");
  17.  
  18. Cookie[] cookies=request.getCookies();
  19. for(int i=0;cookies!=null&&i<cookies.length;i++){
  20. if(cookies[i].getName().equals("bookHistory")){
  21. String bookHistory=cookies[i].getValue();
  22.     
  23. String[] ids=bookHistory.split("\\_");
  24.  
  25. for(String id:ids){
  26. Book book=linkedHashMap.get(id);
  27. printWriter.write(book.getName());
  28. printWriter.write("<br/>");
  29. }
  30. break;
  31. }
  32. }

  4、超链接跳转后处理数据

  1. private String makeHistory(HttpServletRequest request,String id){
  2. String bookHistory=null;
  3. Cookie[] cookies=request.getCookies();
          //找到匹配的cookies
  4. for(int i=0;cookies!=null&&i<cookies.length;i++){
  5. if(cookies[i].getName().equals("bookHistory")){
  6. bookHistory=cookies[i].getValue();
  7. }
  8. }
  9. if(bookHistory==null){
  10. return id;
  11. }
  12. String[] strings=bookHistory.split("\\_");
  13. //为了方便增删减改
  14. List<String> list=Arrays.asList(strings);
  15. LinkedList<String> linkedList=new LinkedList<String>();
  16. linkedList.addAll(list);
  17. //排序
  18. if(linkedList.contains(id)){
  19. linkedList.remove(id);
  20. linkedList.addFirst(id);
  21. }else if(linkedList.size()>=3){
  22. linkedList.removeLast();
  23. linkedList.addFirst(id);
  24. }else{
  25. linkedList.addFirst(id);
  26. }
  27. //拼接
  28. StringBuffer stringBuffer=new StringBuffer();
  29. for(String s:linkedList){
  30. stringBuffer.append(s+"_");
  31. }
  32. return stringBuffer.deleteCharAt(stringBuffer.length()-1).toString();
  33. }

  5、超链接页面显示以及将处理后的数据存到cookie

  1.      response.setContentType("text/html;charset=UTF-8");
  2. String id=request.getParameter("id");
  3. Book book=(Book)DB.getAll().get(id);
  4.  
  5. PrintWriter printWriter=response.getWriter();
  6. printWriter.write("编号"+book.getId()+"<br/>");
  7. printWriter.write("名称"+book.getName()+"<br/>");
  8. printWriter.write("作者"+book.getAuthor()+"<br/>");
  9.  
  10. String bookHistory=makeHistory(request,id);
  11. Cookie cookie=new Cookie("bookHistory", bookHistory);
  12. cookie.setMaxAge(20000);
  13. response.addCookie(cookie);

Servle第四篇(会话技术之cookie)的更多相关文章

  1. 会话技术( Cookie ,Session)

    会话技术:    会话:浏览器访问服务器端,发送多次请求,接受多次响应.直到有一方断开连接.会话结束.        解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据.           ...

  2. JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)

    1.转发和重定向 HttpServletResponse response 转发: RequestDispatcher dispatcher = request.getRequestDispatche ...

  3. 会话技术、Cookie技术与Session技术

    一.会话技术  1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的.  2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...

  4. Java第三阶段学习(十三、会话技术、Cookie技术与Session技术)

    一.会话技术  1. 存储客户端状态 会话技术是帮助服务器记住客户端状态(区分客户端)的.  2. 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录这 ...

  5. [转]【会话技术】Cookie技术

    建立时间:6.29 & 6.30 一.会话技术简介 1.存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪  里?因为Http协议是无状态的,也就是说 ...

  6. 会话技术之Cookie

    在无状态的客户端(未登录)下,张三想买手机然后把手机加入购物车,服务器发出添加成功的响应,然后把手机加入ServletContext域里,然后张三想在逛逛别的, 再无状态的客户端(未登录)下,李四想买 ...

  7. Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】

    什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话. 为什么我们要使用会话技术 ...

  8. JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解

    Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...

  9. servlet会话技术:Cookie

    什么是会话会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.会话过程中需要解决的一些问题每个用户在使用浏览器与服务器进 ...

随机推荐

  1. win10家庭版,双击bat文件无法运行(double click bat file does not execute)

    win10家庭版,双击bat文件无法运行,弹出文件打开方式选择框. 在网上搜索处理办法,试了以下方法1-5都没有成功,用方法6规避. 方法1:打开一个驱动器,点“工具-文件夹选项→文件类型→新建→扩展 ...

  2. 决策树(decision tree)

    决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...

  3. idea springboot 父子工程 子工程maven不自动import

    父工程删除对spring boot启动项的引用,因为父工程 dependencyManagement,它不会自动加载包,只指定包的版本, 如果在父工程中引用了包,但是没有指定包版本,子工程将不会识别到 ...

  4. 在Windows 10 64-bit上安装Windows SDK 7.1和.NET4

    目的: 成功在window10上安装window sdk7.1 和 .NET Framework 4 需求: support some older software written in Visual ...

  5. 初识异步、并发处理纯代码及Demo

    多线程Thread 处理 Thread thread = new Thread(()=> { ; i < ; i++) { Console.WriteLine("这是第" ...

  6. 位运算骚操作 Part 3

    ▶ 异或运算 "^" 具有的部分性质: ● 交换律,结合律 ● a ^ b == (!a & b) | (a & !b),a ^ 1 == !a,a ^ 0 == ...

  7. Python爬虫与数据分析之进阶教程:文件操作、lambda表达式、递归、yield生成器

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  8. 断断续续Python看到现在

    没有项目的支持 承认自己实践不足 但心怀梦想 我一定可以的

  9. dubbo . dubbo Please check registry access list (whitelist/blacklist) 错误

    dubbo Please check registry access list (whitelist/blacklist) dubbo服务调用provider失败.解决办法: 再consumer的服务 ...

  10. 关于ComboBox的控件事件CBN_SELCHANGE总是取到旧值的问题

    我发现复选框,选择以后,在这个事件函数中,总是取到旧值,读了这个朋友的文章,找到了解决方法. 下面是参考的文章: http://scorpiomiracle.iteye.com/blog/710511 ...