文档章节

会话技术介绍-cookie

遥远的绝响
 遥远的绝响
发布于 2015/11/11 16:42
字数 1122
阅读 95
收藏 12

##会话技术介绍 ###什么是会话技术 会话可以简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源然后关闭浏览器,整个过程称之为一个会话。 ###会话过程要解决的一些问题 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据, 例如:用户点击点击超链接通过一个servlet购买一个商品,程序应该保存用户购买的产品,以便于用户点结账时,结账servlet可以得到用户商品为用户结账。 question:用户购买的商品保存在request或servletContext行不行 answer:不行 ##保存会话数据的两种技术 cookie是客户端技术, 程序把每个用户的数据,以cookie的形式写给用户各自的浏览器,当浏览器再去访问服务器中的web资源时,就会带着各自的数据去,这样,web资源处理的就是用户各自的数据了。

session是服务端技术
利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session是用户浏览器对象,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它资源再从用户各自的session中取出数据为用户服务。

##cookie案例 ###cookie api javax.servlet.http.cookie类用户创建一个cookie,response接口中也定义了一个addCookie方法,它用于在其响应头中增加一个相应的set-cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户提交的cookie。 cookie类的方法:

  1. public Cookie(String name,String value)
  2. setValue , getValue
  3. setMaxAge , getMaxAge
  4. setPath, getPath
  5. setDomain,getDomain
  6. getName

生成cookie的代码

Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis());
cookie.setMaxAge(10);
cookie.setPath("/day07");
response.addCookie(cookie);

删除cookie cookie.setMaxAge(0); 用js也可以删除Cookie ##显示用户上次访问的时间

        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        pw.print("你上次的访问时间是:");
        Cookie cookies[] = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            if (cookies[i].getName().equals("lastAccessTime")) {
                long cookieValue = Long.parseLong(cookies[i].getValue());
                Date date = new Date(cookieValue);
                pw.print(date.toLocaleString());
            }
        }

        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(120);
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);

##cookie的细节

*. 一个cookie职能标识一种信息,它至少含有一个标识该信息的名称(name)和值(value)

*. 一个web站点可以给一个web浏览器发送多个Cookie,一个WEB浏览器也可以存储多个web站点提供的cookie。

*. 浏览器一般只允许存放300个cookie,每个站点最多存放20个cookie,每个cookie的大小限制为4KB。

*. 如果创建一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(存储在浏览器的内存中),用户推出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用setMaxAge,并给出一个以秒为单位的时间。将最大实效设为0则是命令浏览器删除该cookie。

*. 删除cookie时,path必须一致,否则不会删除。

##cookie案例:显示用户浏览历史纪录

需求说明

public class ViewallServlet extends HttpServlet {
 response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.write("本网站有如下商品: </br>");
        Map<Integer, Book> map = Db.getAll();
        Set<Entry<Integer, Book>> entrySet = map.entrySet();
        for (Entry<Integer, Book> entry : entrySet) {
            Book book = entry.getValue();
            out.print("<a href=/test-web/BuybookServlet?id=" + entry.getKey() + ">" + book.getName() + "</a><br/>");
        }
        
        // 显示用户曾经看过的商品
        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            if (cookie.getName().equals("bookHistory")) {
                String value = cookie.getValue();
                if (value == null) {
                    return;
                }
                System.out.println(value);
                String[] ids = value.split(",");
                for (String id : ids) {
                    out.print("浏览过的商品</br>");
                    out.print(Db.getAll().get(Integer.valueOf(id)).getName() + "</br>");
                }
            }
        }
}

public class BuybookServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String id = request.getParameter("id");
        Book book = Db.getAll().get(Integer.valueOf(id));
        PrintWriter pw = response.getWriter();
        pw.print(book.getId() + "</br>" + book.getName());
        // 构建cookie,回写浏览器
        String cookieValue = buildCookie(id, request);
        Cookie cookie = new Cookie("bookHistory", cookieValue);
        cookie.setMaxAge(600);
        cookie.setPath(request.getContextPath());
        response.addCookie(cookie);
    }

    private String buildCookie(String id, HttpServletRequest request) {
        String bookHistory = null;
        Cookie cookies[] = request.getCookies();
        if (cookies == null) {
            return id;
        }
        for (Cookie cook : cookies) {
            if (cook.getName().equals("bookHistory")) {
                bookHistory = cook.getValue();
                break;
            }
        }
        if (bookHistory == null) {
            return id;
        }
        LinkedList<String> list = new LinkedList<String>();
        String[] splits = bookHistory.split("\\,");
        for (String split : splits) {
            list.addFirst(split);
        }

        if (list.isEmpty()) {
            return id;
        }

        if (list.contains(id)) {
            list.remove(id);
            list.addFirst(id);
        } else {
            if (list.size() > 3) {
                list.removeLast();
                list.addFirst(id);
            } else {
                list.addFirst(id);
            }
        }
        StringBuffer buffer = new StringBuffer();
        for (String bid : list) {
            buffer.append(bid).append(",");
        }
        buffer.deleteCharAt(buffer.length()-1);
        return buffer.toString();
    }
}

© 著作权归作者所有

上一篇: 会话技术-session
下一篇: Request对象
遥远的绝响
粉丝 2
博文 23
码字总数 14132
作品 0
昆山
私信 提问
深入探究 cookie 在 J2ME 平台的应用

好吧,我承认这篇文章的确是out了!转一下而已! 【IT168 技术】本文向大家简单介绍一下cookie技术在J2ME平台的应用与实现,首先,我们来看一下cookie的原理。当服务器需要和浏览器维持某一状...

鉴客
2011/06/10
189
0
网络攻击技术——Broken authentication

1.1.1 摘要 在日常的互联网生活当中,我们几乎都离不开用户验证登陆功能,例如:登陆微博,Gmail,博客园,Stackoverflow等网站,这给我们带来了一些不便,就是要管理一堆的用户名和密码,也...

长平狐
2012/06/11
292
0
Django之路——8 cookie 和sessions

class HttpResponseBase: login.html:登录页面,提供登录表单; index1.html:主页,显示当前用户名称,如果没有登录,显示您还没登录; index2.html:主页,显示当前用户名称,如果没有登录...

袁勇i
2018/07/05
0
0
JavaEE 要懂的小事:三、图解Session(会话)

Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter :BYSocket 相继 图解Http协议 和 图解Cookie 之后,中间迷茫期哈,没写了!可是又要告诉...

泥沙砖瓦浆木匠
2015/07/12
6.8K
27
Cookie vs Session

定义 Cookie:指网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。 Session:也称会话,是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交...

KevinCoding
2016/09/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

thinkphp5.1学习过程四——trait

<?php /** *trait实现了代码的复用 *并且突破了单继承的限制 *trait是类不是类,不能实例化 */ trait Demo1 { public function hello1() { return __METHOD__; } } trait Demo2 { public fu......

大海yht
26分钟前
6
0
DB2 sequence 操作

操作DB2 下 sequence seqName db2数据库一般seq还是比较大的,但是程序在调用的时候还是不可避免的有一些bug, 下面是对于seq一些简单的操作,也作为工作的一些记录 1、命令行取sequence se...

飞雪无痕
33分钟前
6
0
《吊打面试官》系列-秒杀系统设计

你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 絮叨 之前写了很多Redis相关的知识...

敖丙
39分钟前
12
0
Qt编写气体安全管理系统11-数据打印

一、前言 在各种软件系统中,数据打印也是常用的功能之一,一般来说会对查询的数据结果导出到excel,还会对查询的数据结果直接打印,在Qt中提供了打印机类QPrinter,在printsupport组件中,可...

飞扬青云
45分钟前
5
0
初级阶段

#include <stdio.h> #include <stdlib.h> int main(){ int a; int Sn = 0; int i; int tmp = 0; scanf_s("%d", &a); for (i = 1; i <= 5; i++) { tmp = tmp * 10 + a; Sn += tmp; } printf("......

Lxxxxx256
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部