什么是会话
会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中需要解决的一些问题
每个用户在使用浏览器与服务器进行会话的过程中,不可避免的各自会产生一些数据,服务器要想办法为每个用户保存这些数据。例如:多个用户点击超链接通过一个servlet各自购买了一个商品,服务器应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点击结账servlet时,结账servlet可以得到用户各自购买的商品为用户各自购买的商品结账。
为什么需要会话技术
1.如何保存用户上次登录时间
2.如何显示用户浏览历史
3.如何把登录的用户名和密码保存电脑,下次登录无需从新输入。

保存用户名:

public class CreateCookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=utf-8");

        //创建保存用户名的cookie,cookie是在服务端创建的
        Cookie cookie = new Cookie("name", "zhangsan");
        //设置cookie的生命周期,有效时间
        cookie.setMaxAge(3600);
        //把cookie信息回写给浏览器
        response.addCookie(cookie);

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request,response);
    }
}

第一次访问CreateCookie的http响应

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: name=zhangsan; Expires=Mon, 18-Apr-2016 12:33:18 GMT
Content-Length: 0
Date: Mon, 18 Apr 2016 11:33:18 GMT

cookie文件内容

name
zhangsan
localhost/cookie/      //web应用
1536
2084092672
30513518
452421040
30513510
*

cookie保存在客户端浏览器的缓存目录下

那么怎么读取cookie文件呢

public class ReadCookie extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        //读取所有的cookie信息,选取你需要的cookie
        Cookie[] cookies = request.getCookies();
        //遍历cookies
        for (int i = 0; i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            out.println("cookie 的信息  name = "+cookie.getName()+" value = "+cookie.getValue());
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request,response);
    }
}

访问ReadCookie的http请求

GET /cookie/ReadCookie HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive
Cookie: name=zhangsan
request.getCookies()可以从http请求中获取所有的cookie

Cookie的原理图

Cookie的小结
①Cookie是在服务器端创建的。
②Cookie是保存在浏览器这一端的。
③Cookie的生命周期可以通过cookie.setMaxAge(2000); 设置。
如果不设置,该cookie的生命周期当浏览器关闭时就消亡。
④Cookie是可以被多个浏览器共享的。
⑤怎么理解
我们可以把cookie想成一张表:
 如果cookie重名会有什么问题?
重名会替换原来的值。
⑥一个站点可以保存多个cookie
⑦Cookie存放时是以明文方式存放的,因此安全性比较低。我们可以通过加密后在保存。

 记录用户上次登录时间

public class Servlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        //读取cookie
        Cookie[] cookies = request.getCookies();
        //假设记录上次登录时间的cookie的形式是"lasttime"="2011-11-11 11:11:11"
        //这里需要考虑一种情况,就是第一次登录
        boolean flag = false;//没有找到
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if ("lasttime".equals(name)) {
                    out.println("您上次登录时间是" + cookie.getValue());
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String nowTime = simpleDateFormat.format(new Date());
                    cookie.setValue(nowTime);
                    cookie.setMaxAge(7 * 3600 * 24);
                    response.addCookie(cookie);
                    flag = true;
                    break;

                }
            }
        }

        if (!flag) {
            //没有找到,用户是第一次登录
            out.println("欢迎您第一次登录");
            //创建cookie
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String nowTime = simpleDateFormat.format(new Date());
            Cookie cookie = new Cookie("lasttime", nowTime);
            cookie.setMaxAge(7 * 3600 * 24);
            response.addCookie(cookie);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
}

记住用户名和密码:

Login.java

public class Login extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        String name = "";
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("name")) {
                    name = cookie.getValue();
                }
            }
        }
        out.println("<form action='/cookie/LoginCl' method='post'>");
        out.println("name:<input type='text' name='name' value='"+name+"'><br/>");
        out.println("pwd:<input type='password' name='passwd'><br/>");
        out.println("<input type='checkbox' name='iskeepinfo' value='keep'>在此电脑上保存用户名<br/>");
        out.println("<input type='submit' value='submit'>");
        out.println(" </form>");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
}

LoginCl.java

public class LoginCl extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        PrintWriter out = response.getWriter();
        //用户是否勾选保存用户名
        String name = request.getParameter("name");
        String pwd = request.getParameter("passwd");
        String val = request.getParameter("iskeepinfo");
        if (val != null && "keep".equals(val)) {
            //需要保存用户名
            //创建Cookie保存用户名
            Cookie cookie = new Cookie("name", name);
            cookie.setMaxAge(2 * 7 * 24 * 3600);
            response.addCookie(cookie);
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }
}

Cookie深入讨论:

1.一个cookie只能保存字符串信息,其结构是

Cookie(java.lang.String name,java.lang.String value)

2.一个浏览器最多放入300个cookie,一个站点最多20个cookie 每个cookie大小限制在4K以内。

3.Cookie生命周期

--Cookie默认生命周期是会话级别的,用户退出浏览器之后就被删除。

--通过setMaxAge()可以设置生命周期

----setMaxAge(正数) 即多少秒后该cookie失效

----setMaxAge(0)  删除该cookie

Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
    if("id".equals(cookie.getName())){
        cookie.setMaxAge(0);//删除
        response.addCookie(cookie);//回写浏览器,否则不生效
        break;
    }
}

如果该web应用中只有一个cookie 则该cookie删除后,浏览器的临时文件夹下就没有了该cookie文件。如果一个web应用中有多个cookie,该cookie被删除文件还在。

setMaxAge(负数),相当于该cookie的生命周期是会话级的。

3.Cookie存放中文怎么处理

存放时:
String val = java.net.URLEncoder.encode("张三","UTF-8");
Cookie cookie = new Cookie("uname",val);
取出时:
String val = java.net.URLEncoder.decode(cookie.getValue(),"UTF-8");
Out.println("uname="+val);

servlet会话技术:Cookie的更多相关文章

  1. Servlet 会话技术cookie和session

    会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...

  2. 会话技术cookie与session

    目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...

  3. Java EE会话技术Cookie和Session

    会话技术 一.定义 会话技术是帮助服务器记住客户端状态的(区分客户端的).将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术. 注意: 一次会话何时开始?从打开一个浏览器 ...

  4. java ->会话技术Cookie&Session

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

  5. 会话技术cookie和session详解

    什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一 ...

  6. JavaWeb学习笔记五 会话技术Cookie&Session

    什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...

  7. 会话技术Cookie

    1.会话技术 1>什么是会话技术: 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话. 2>作用: 会话技术就是记录这次会话中客户端的状态与数据的. Cookie:数 ...

  8. 会话技术: Cookie 和 Session

    会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...

  9. JAVA基础之会话技术-Cookie及Session

    至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...

随机推荐

  1. Asp.net MVC知识积累

    一.知识积累 http://yuangang.cnblogs.com/ 跟蓝狐学mvc教程专题目录:http://www.lanhusoft.com/Article/169.html 依赖注入:htt ...

  2. linux文件的通用操作方法学习

    2014-07-29 23:36:10 在linux下用文件描述符来表示设备文件和普通文件.文件描述符是一个整型的数据,所有对文件的操作都通过文件描述符实现. 文件描述符示文件系统中连接用户空间和内核 ...

  3. 把数组排成最小的数/1038. Recover the Smallest Number

    题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.   Give ...

  4. N个顶点构成多边形的面积

    Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1 ...

  5. cadence PCB绘制步骤

    1 创建一个PCB文件  file -> new 2 创建一个板框  add -> line ,在 options 选型中选择好,板框为 长 4400mil 宽 3200 3 给PCB板框 ...

  6. 怎样在cmd(命令提示符)下进行复制粘贴操作

    如右图,右键命令提示符窗口的标题栏,选择属性.     选择“编辑选项”里的“快速编辑模式”,并确定之:   在弹出的应用选择提示框上选择“保存属性,供以后具有相同标题的窗口使用”:   如此你就可以 ...

  7. COCOS2DX2.2.2 创建CCEditBox输入框架实现文本及密码输入

    本文转载于: http://5.quanpao.com/?p=561 使用CCEditBox需要启用扩展库既extension ,因此需要引入这个空间名 有两种方法, using namespace ...

  8. OpenWrt固件刷入后串口终端没有反应的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...

  9. .NET开源项目介绍及资源推荐:数据持久层

    在.NET平台下,关于数据持久层框架非常多,本文主要对如下几种做简要的介绍并推荐一些学习的资源: 1.NHibernate 2.NBear 3.Castle ActiveRecord 4.iBATIS ...

  10. python pip和easy_install使用方式(转载)

    easy_install 跟 pip 都是Python 的套件管理程式,有了它们,在使用 Python 开发程式的时候会带来不少方便. easy_install 和pip 有什麼不一样?据 pip 官 ...