会话

什么是会话?

简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话。

会话过程要解决什么问题

  • 每个用户在使用浏览器与服务器进行会话的过程中,都会产生一些数据,程序要想办法为每个用户保存这些数据
  • 例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便用户点结账servlet时,结账servlet可以得到用户购买的商品为用户结账。

Cookie

Cookie的属性

  1. name:Cookie的名字
  2. value:Cookie的值
  3. path:Cookie的存储路径,默认是访问的Servlet所在路径(可选)
  4. MaxAge:最大的存活时间,默认是存放在缓存区中的,生命周期就是一个会话(可选)
  5. version:Cookie的版本
  6. domain:域名(哪个网站)
  7. Comment:备注

Cookie的相关用法

程序为:记录上次访问的时间

  • ServletCookie1中

    request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter(); out.write("您上次访问的时间是:");
    //拿到客户端携带的记录上次访问时间的Cookie:假设Cookie的名字是lastaccesstime,值是一个long类型的值
    //拿到客户端携带的所有的Cookie
    Cookie[] cs = request.getCookies();
    //循环判断拿到需要的Cookie
    for (int i=0; cs!=null && i<cs.length; i++){
    Cookie c = cs[i];
    if(c.getName().equals("lastaccesstime")){
    //说明找到了需要的Cookie
    String time = c.getValue();
    //将time转化为long类型的值
    long t = Long.parseLong(time);
    //格式化为我们需要的格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    //创建一个date对象
    Date d = new Date(t);
    //将数据输出到页面
    out.write(sdf.format(d) + "&nbsp;&nbsp;
    <a href = 'request.getContextPath()+"/servlet/ServletCookie2"'>清除Cookie</a>");
    }
    //向客户端发送Cookie
    Cookie c = new Cookie("lastaccesstime", new Date().getTime() + ""); //设置Cookie的存活时间
    //(只要设置了此时间,此Cookie就将存储到客户端的硬盘上,不会在缓存中存储)
    c.setMaxAge(Integer.MAX_VALUE); //设置浏览器携带Cookie的路径
    c.setPath(request.getContextPath()); //设置路径如果是/,意味着访问服务器上的任意工程资源都会携带此Cookie
    //c.setPath("/"); //此路径是服务器的根路径:协议+主机名+端口号 //发送到客户端
    response.addCookie(c);
    }
  • ServletCookie2中(删除存储的Cookie)

    //sun公司没有提供相应的方法
    //所以创建一个同名的cookie,将存活时间设置为0即可,然后覆盖客户端存储的cookie
    Cookie c = new Cookie("lastaccesstime","");
    c.setMaxAge(0); //设置路径
    c.setPath(request.getContextPath()); //发送到客户端
    response.addCookie(c);
  • ServletCookie3(演示path的含义)

    path的含义:默认情况下,客户端存储的Cookie的路径就是发送Cookie的Servlet的路径

    //拿到客户端所有的Cookie
    Cookies[] cs = request.getCookies();
    //拿到记录上次访问时间的Cookies
    for(int i=0; cs!=null && i<cs.length; i++) {
    Cookie c = cs[i];
    if(c.getName().equals("lastaccesstime")){
    String value = c.getValue();
    out.write(value);
    }
    }

Cookie应用:记住用户名密码

  • ServletUI中:

    创建一个登录页面

        request.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter(); //拿到错误信息
    String error = (String)request.getAttribute("error");
    if(error != null)
    out.write("<font color = red>" +error+ "</font>"); String username="";
    String pass = ""; //拿到客户端携带的所有Cookie
    Cookie[] cs = request.getCookies();
    //循环判断
    for(int i=0; cs!=null && i<cs.length; i++){
    Cookie c = cs[i];
    if(c.getName().equals("name")){
    //说明找到了存储用户名的cookie
    username = c.getValue();
    }
    if(c.getName().equals("pass"))
    //说明找到了存储密码的cookie
    pass = c.getValue();
    } //创建登录页面
    out.write("<form action = '" + request.getContextPath() +
    "/servlet/LoginServlet"' method = 'post'>");
    out.write("姓名:<input type = 'text' name = 'username' value = '"+ username + "'><br>");
    out.write("密码:<input type = 'text' name = 'password' value = '"+ pass + "'><br>");
    out.write("<input type = 'checkbox'
    name = 'remember' value = 'on'>记住用户名及密码两周<br>");
    out.write("<input type = 'submit' value = '登录'><br>");
  • LoginServlet中:

    1.判断用户是否是合法用户

    2.看用户是否选择了记录用户名和密码

        //拿取浏览器传递的数据
    String name = request.getParameter("username");
    String pass = request.getParameter("password");
    String remember = request.getParameter("remember"); //判断用户是否是合法用户:假定name和pass的依序一样就是合法
    //拿到密码的逆序
    String pass1 = new StringBuffer(pass).reverse().toString(); //判断
    if(name.equals(pass1)){
    //表示合法 Cookie c = new Cookie("name",name);
    Cookie c1 = new Cookie("pass",pass); //判断用户是否选择了记住用户名和密码
    if("on".equals(remember)){
    //说明用户选择了记录 //设定存储到客户端的硬盘上
    c.setMaxAge(Integer.MAX_VALUE);
    c1.setMaxAge(Integer.MAX_VALUE);
    }else{
    //设定客户端存储的用户名和密码立刻失效
    c.setMaxAge(0);
    c1.setMaxAge(0);
    }
    //设定访问路径
    c.setPath(request.getContextPath());
    c1.setPath(request.getContextPath()); //向客户端发送Cookie
    response.addCookie(c);
    response.addCookie(c1); request.setAttribute("name", name);
    request.getRequestDispatcher("MainServlet").forward(request, response);
    }else{
    //非法用户
    request.setAttribute("error", "用户名或密码错误");
    request.getRequestDispatcher("ServletUI").forward(request,response);
    }
  • MainServlet中:

        String name = (String)request.getAttribute("name");
    
        out.write(name + "欢迎你");

Session(也是域对象)

在Web开发中,服务器为每个用户创建一个会话对象(session对象),即一个浏览器独占一个session对象(默认)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

创建session

  • Servlet1

    1.看客户端是否携带了JSESSIONIDCookie

    2.如果没有携带,创建一个新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中;

    如果携带了,将根据cookie的值(id)到服务器的内存中寻找session,如果找到了则返回此session为客户端服务,如果找不到,则创建新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中

    HttpSession session = request.getSesstion();
    String id = session.getId();
    System.out.println("id:" + id);
    session.setAttribute("name", "Tryking");
  • Servlet2

    如果先访问1,不关浏览器再访问2。则两个id的值是一样的

    HttpSession session = request.getSession();
    String id = session.getId();
    System.out.println("id:" + id);
    String name = (String)session.getAttribute("name");

Web开发之Cookie and Session的更多相关文章

  1. web开发之Cookie使用

    做过web开发的小伙伴对于Cookie一定不陌生,当用户登录后将用户的账号保存到本地,密码保存时,建议使用MD5进行加密,以防止用户个人信息的泄露.今天和大家简单聊聊关于Jquer Cookie的使用 ...

  2. Vim下的Web开发之html,CSS,javascript插件

    Vim下的Web开发之html,CSS,javascript插件   HTML 下载HTML.zip 解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vi ...

  3. Web开发之Tomcat&Servlet

    <!doctype html>01 - JavaEE - Tomcat&Servlet figure:first-child { margin-top: -20px; } #wri ...

  4. 移动web开发之rem适配布局

    移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...

  5. Java web 会话技术 cookie与session

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

  6. web存储中cookie、session区别

    http协议是一种无状态的协议,浏览器对服务器的每一次请求都是独立的.为了使得web能够产生一些动态信息,就需要保存”状态”,而cookie和session机制就是为了解决http协议无状态而产生.c ...

  7. web.py之cookie和session

    官方给的session例子这里就不讲了.下面直接将怎么设置session,取session: session相关代码一定要放在web.py框架的Main.py里面. # Main.py # 设置ses ...

  8. Python Web开发之Flask

    PythonWEB框架之Flask 前言: Django:1个重武器,包含了web开发中常用的功能.组件的框架:(ORM.Session.Form.Admin.分页.中间件.信号.缓存.ContenT ...

  9. Web 开发之 HTTP/2 & SPDY & HTTP 1.1 & HTTP 对比分析详解!

    1 https://zh.wikipedia.org/wiki/HTTP/2 HTTP/2 维基百科,自由的百科全书                         HTTP/2(超文本传输协议第2版 ...

随机推荐

  1. 【Redis的那些事 · 上篇】Redis的介绍、五种数据结构演示和分布式锁

    Redis是什么 Redis,全称是Remote Dictionary Service,翻译过来就是,远程字典服务. redis属于nosql非关系型数据库.Nosql常见的数据关系,基本上是以key ...

  2. HTTP强缓存和协商缓存

    一.浏览器缓存 Web 缓存能够减少延迟与网络阻塞,进而减少显示某个资源所用的时间.借助 HTTP 缓存,Web 站点变得更具有响应性. (一).缓存优点: 减少不必要的数据传输,节省带宽 减少服务器 ...

  3. 教会你彻底解决android studio c/c++ jni代码无法跳转

    时不时总会遇到原来c c++ jni代码跳转很欢乐,突然也不知道咋滴了build也能build成功,运行也能正常运行,就是代码不能跳转了,首先来科普下一些背景知识. 如果让代码跳转起来,大概需要做哪些 ...

  4. 价格BigDecimal的加减乘除、小数四舍五入、比较

    num2必须改用传入String类型 //加法 BigDecimal result1 = num1.add(num2); //减法 BigDecimal result2 = num1.subtract ...

  5. JAVA通过经纬度获取两点之间的距离

    private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math ...

  6. Kafka Eagle分布式模式

    1.概述 最近有同学留言,Kafka Eagle的分布式模式功能怎么使用,如何部署安装?今天笔者就为大家来详细介绍一下Kafka Eagle的分布式模式功能的安装和使用. 2.内容 首先,这里我们需要 ...

  7. ffmpeg(1)之libavutil/common.h:30:2: error: missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS

    说明 编译环境: mac osx 10.14 + cmake + clang++ 写了一个简单c++的范例调用ffmpeg函数完成音频采集 出错提示 [build] /usr/local/ffmpeg ...

  8. 【LeetCode】680. Valid Palindrome II 验证回文字符串 Ⅱ(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 思路来源 初版方案 进阶方案 日期 题目地址 ...

  9. 【剑指Offer】10- I. 斐波那契数列 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 递归 动态规划 日期 题目地址:htt ...

  10. [CNKI]个人论文收录

    [1]在校期间参加大创项目研究 以论文形式结题 发表时间:2018-03-25 基于VR虚拟现实技术的CBD微圈电商平台的研究 林旭; 陈丽娟 内江科技 2018-03-25 期刊 链接: 基于VR虚 ...