第11章WEB11-Cookie&Session篇

今日任务

  • 显示用户的上次访问时间
  • 登录系统以后显示商品浏览记录
  • 购买商品将商品添加到购物车
  • 系统登录的验证码的校验

教学导航

教学目标

了解JSP的简单的使用

掌握Cookie的使用

掌握Session的使用

教学方法

案例驱动法

1.1      上次课内容回顾:

Response

* 通过response设置状态码:setStatus(int status);

* 通过response设置响应头:setHeader(String name,String value);,setIntHeader(String name,int value),setDateHeader(String name,long date);

* 通过response设置响应体:getOutputStream(),getWriter();

* response的其他的API:

* sendRedirect(String path);//这是重定向的简写。

* response输出中文的乱码问题:

* 字节流输出中文:

* 设置浏览器的字符集编码.   response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);

* 设置输出内容的字节数组的字符集编码.    “”.getBytes(“UTF-8”);

* 字符流输出中文:

* 设置浏览器字符集编码.    response.setHeader(“Content-Type”,”text/html;charset=UTF-8”);

* 设置response的缓冲区的编码.     response.setCharacterEncoding(“UTF-8”);

* response完成了文件下载功能:

Request

* 使用request获得客户机的信息. getRemoteAddr(),getMethod(),getRequestURI(),getRequestURL()

* 获得请求参数:getParameter(),getParameterValues(),getParameterMap()

* 作为域对象存取数据:setAttribute(),getAttribute(),removeAttribute();

* 接收参数的中文乱码的处理:

* GET    :new String(“”.getBytes(“ISO-8859-1”),”UTF-8”)

* POST   :request.setCharacterEncoding(“UTF-8”);

* request何时创建和销毁的?

* 创建:从客户端向服务器发送请求.那么服务器创建一个request对象.

* 销毁:服务器为这次请求作出了响应之后,服务器就会销毁request对象.

* 作用范围:一次请求.

* 转发和重定向区别?

* 转发是一次请求一次响应,重定向两次请求和两次响应.

* 转发地址栏不变,重定向会变化.

* 转发的路径不需要加工程名,重定向需要加工程名.

* 转发只能在本网站内部,重定向可以定向到任何网站.

1.2      案例一:记录用户的上次登陆访问时间.

1.2.1    需求:

用户登录完成后,显示您是第x位访问的用户,您的上次访问时间是:yyyy-MM-dd.

* 如果第一次访问的话,只显示您是第x位用户.

* 如果不是第一次访问的话,显示您是第x位访问的用户,您的上次访问时间是:yyyy-MM-dd.

1.2.2    分析:

1.2.2.1  技术分析:

【会话技术】

  • 什么是会话   :用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话.
  • 常见的会话技术:

* Cookie    :将数据保存到客户端浏览器.

* Session   :将数据保存到服务器端.

  • 为什么使用会话技术?

* 私有的数据,购物信息数据保存在会话技术中.

参见图一和图二

  • 使用会话技术:

【Cookie技术的使用】

  • 向浏览器保存数据:从服务器写会浏览器 response对象

HttpServletResponse有一个方法:

* void addCookie(Cookie cookie);

  • 获得浏览器带过来的Cookie:

HttpServletRequest有一个方法:

* Cookie[] getCookies();

  • 创建一个Cookie对象:

* Cookie(String name,String value);

【JSP的简单概述】

  • 什么是JSP   :Java Server Pages(Java服务器端页面).JSP = Java代码 + HTML的元素 + JSP内置东西
  • SUN公司为什么推出JSP动态网页开发技术:

* SUN公司推出的Servlet技术进行动态网页开发.发现Servlet自身有不足没有办法与ASP,PHP技术竞争.想在动态网页中输出表单.在Servlet中获得PrintWriter out = response.getWriter();

* out.println(“<form action=’’ method=’’>”);

* out.println(“</form>”);

* SUN又推出了动态的网页开发技术就是JSP.

  • JSP的执行过程:

* JSP会被翻译成Servlet,编译成class进行执行的.

  • JSP的嵌入Java代码:JSP的脚本元素

* <%!    %>      :翻译成类中的成员部分. 定义变量,定义方法,定义类.Servlet是线程不安全的,尽量少在类中定义成员属性!!

* <%     %>      :翻译成类的service方法内部的内容. 定义变量,定义类,直接写代码块.

* <%=    %>      :翻译成service方法内部的out.print();

1.2.2.2  步骤分析:

【步骤一】:准备登陆的案例.

【步骤二】:在统计人数的Servlet中.判断是否是第一次访问.

【步骤三】:根据是否是第一次显示不同的信息,同时将当前的时候保存到Cookie中.

1.2.3    代码实现

public class CountServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

Integer count = (Integer) this.getServletContext().getAttribute("count");

//      response.getWriter().println("<h1>现在网站被访问的次数为:"+count+"</h1>");

/**

* 获得浏览器中带过来的所有的Cookie信息,从数组中查找有没有指定名称的Cookie

* 判断用户是否是第一次访问:(从数组中没有找到指定名称的Cookie)

* * 如果是第一次:显示欢迎,记录当前访问的时间存入到Cookie中.

* * 如果不是第一次:显示欢迎,上一次访问时间,同时记录当前访问的时间存入到Cookie中。

*/

// 获得浏览器带过来的所有的Cookie:

Cookie[] cookies = request.getCookies();

// 从数组中查找指定名称的Cookie:

Cookie cookie = CookieUtils.findCookie(cookies, "lastVisit");

// 判断是否是第一次:

if(cookie == null){

// 第一次访问

response.getWriter().println("您是第"+count+"位访客!");

}else{

// 不是第一次

Long l = Long.parseLong(cookie.getValue());

Date d = new Date(l);

response.getWriter().println("您是第"+count+"位访客! 上次访问时间是:"+d.toLocaleString());

}

// 创建一个Cookie对象:

Cookie c = new Cookie("lastVisit",""+System.currentTimeMillis());

// 保存到浏览器端:

response.addCookie(c);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

1.2.4    总结:

1.2.4.1  Cookie的常用API:

  • Cookie的常用的API:

* getName();

* getValue();

* setDomain(String domain); -- 设置Cookie的有效域名. //  www.baidu.com  music.baidu.com

* setPath(String path); -- 设置Cookie的有效路径.

* setMaxAge(int maxAge); -- 设置Cookie的有效时间.

  • Cookie的分类有关:

* 会话级别的Cookie:默认的Cookie.关闭浏览器Cookie就会销毁.

* 持久级别的Cookie:可以设置Cookie的有效时间.那么关闭浏览器Cookie还会存在. 手动销毁持久性Cookie. setMaxAge(0)---前提是有效路径必须一致.

1.3      案例二:记录用户的商品浏览记录:

1.3.1    需求:

在购物网站上浏览商品的信息,商家为了留住用户,记住之前浏览的一些商品.

1.3.2    分析:

1.3.2.1  技术分析:

1.3.2.2  步骤分析:

【步骤一】:在登录完成后,显示商品列表页面.

【步骤二】:为商品列表页面做一些准备工作.

【步骤三】:点击某个商品,将商品ID传递一个Servlet.

【步骤四】:在Servlet中:判断是否是第一次浏览商品

【步骤五】:如果是第一次:将商品的ID存入到Cookie中即可.

【步骤六】:如果不是第一次:判断该商品是否已经浏览了.

【步骤七】:如果浏览器过.删除之前元素,将该元素添加到最前面.

【步骤八】:如果没有浏览过该商品.判断最大长度,没有超过限制,直接加到最前,如果已经超过限制,删除最后一个,将其插入到最前.

1.3.3    代码实现:

public class ProductServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

/**

* * 接收商品id.

* * 接收从客户端带过来的所有Cookie.

* * 从Cookie的数组中查找指定名称的Cookie.

* * 判断是否是第一次浏览商品:

*     * 第一次浏览商品

*        * 直接将商品的ID存入到Cookie.

*        * 将Cookie回写到浏览器.

*     * 不是第一次浏览商品 1-2

*        * 判断当前的商品是否已经在浏览记录.

*            * 已经存在: 2-1 移除当前元素,将当前元素添加到最开始.

*            * 没在浏览记录中:

*                * 判断是否已经超过了最大长度:如果超过 2-1-3:删除最后一个 将当前元素添加到最前面.

*                * 没有超过:直接将该元素添加到最前位置.

*        * 将转换的id的值存入到Cookie,回写浏览器.

*/

// 接收id:

String id = request.getParameter("id");

// 获得所有的Cookie的信息:

Cookie[] cookies = request.getCookies();

// 判断是否是第一次:

Cookie cookie = CookieUtils.findCookie(cookies, "history");

if(cookie == null){

// 第一次浏览商品

Cookie c = new Cookie("history",id);

c.setPath("/day11");

c.setMaxAge(60*60*24*7);

response.addCookie(c);

}else{

// 不是第一次浏览

// 判断选择的商品是否已经在浏览记录中 2-1

String value = cookie.getValue();

String[] ids = value.split("-");

// 将数组变为集合:

LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));

if(list.contains(id)){

// 之前浏览过该商品

list.remove(id); // 1-2-3

list.addFirst(id);

}else{

// 没有浏览过该商品.

if(list.size() >=3 ){

// 超过3个

list.removeLast();

list.addFirst(id);

}else{

// 没到3个.

list.addFirst(id);

}

}

// 将list中的元素取出,使用-连接上保存到Cookie,写回浏览器.

StringBuffer sb = new StringBuffer();

for(String s:list){

sb.append(s).append("-");

}

String sValue = sb.toString().substring(0,sb.length()-1);

System.out.println(sValue);

// 存入到Cookie中

Cookie c = new Cookie("history",sValue);

c.setPath("/day11");

c.setMaxAge(60*60*24*7);

response.addCookie(c);

}

request.getRequestDispatcher("/demo2/product_info.htm").forward(request, response);

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

1.3.4    总结:

1.3.4.1  清空浏览记录:

删除持久性的Cookie:

public class ClearServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Cookie cookie = new Cookie("history",null);

cookie.setPath("/day11");

cookie.setMaxAge(0);

response.addCookie(cookie);

response.sendRedirect("/day11/demo2/product_list.jsp");  //这是重定向的简单写法。

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}

}

1.4      案例三:将商品添加到购物车:

1.4.1    需求:

查看某个商品详情的时候,添加到购物车.需要将商品添加到购物车.

1.4.2    分析:

1.4.2.1  技术分析:

【Session的概述】

Cookie本身是有大小和个数的限制.Session没有限制.Cookie的数据保存在客户端,Session数据保存在服务器端.

  • Session的执行原理:基于Cookie的.
  • 使用Session:

* 获得Session:

* request.getSession();

1.4.2.2  步骤分析:

【步骤一】:点击加入购物车提交到Servlet

【步骤二】:在Servlet将购物的商品存入到Session中.

【步骤三】:可以创建一个Map集合用于保存购物信息Map的key可以是商品的名称,Map的value是数量.

【步骤四】:在购物车页面中显示Map中的数据就可以.

1.4.3    代码实现:

public class CartServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 接收商品名称:

String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

// 创建Map集合用于保存购物信息.Map<String,Integer> Map的key是商品的名称 value是购买的数量.

Map<String,Integer> map = (Map<String, Integer>) request.getSession().getAttribute("cart");

if(map == null){

map = new LinkedHashMap<String,Integer>();

}

// 判断购物车中是否已经买了该商品.

if(map.containsKey(name)){

// map中已经有该商品:// * 如果购物车中已经有该商品: 获得到Map中该商品的数量+1。 存回到Map集合中.

Integer count = map.get(name);

count++;

map.put(name, count);

}else{

// map中没有该商品.// * 如果购物车中没有改商品: 将商品添加到Map集合中 数量1.

map.put(name, 1);

}

// * 将Map集合保存到session中.

request.getSession().setAttribute("cart", map);

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

response.getWriter().println("<h3><a href='/day11/demo2/product_list.jsp'>继续购物</a> | <a href='/day11/demo2/cart.jsp'>去结算</a></h3>");

}

1.4.4    总结:

1.4.4.1  Session是域对象:

session何时创建和销毁?作用范围:

* 创建:服务器端第一次调用getSession()创建session.

* 销毁:三种情况销毁session:

* 1.session过期. 默认过期时间为30分钟.

* 2.非正常关闭服务器.如果正常关闭session序列化到硬盘.

* 3.手动调用session.invalidate();

* 作用范围:多次请求.(一次会话)

1.5      案例四:进行一次性验证码的校验

1.5.1    需求:

在登录的页面中,需要有一个验证码的校验.

1.5.2    分析:

1.5.2.1  技术分析:

使用session保存生产的验证码.

1.5.2.2  步骤分析:

【步骤一】:生成验证码,将生成验证码的随机的4个字母或数字保存到session中.

【步骤二】:在页面中输入验证码值,点提交.

【步骤三】:在Servlet中从表单中获得验证码从session中获得一个验证码.

【步骤四】:比对两个验证码值是否一致.

【步骤五】:将session中保存的验证码清空.

1.5.3    代码实现:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// 校验验证码程序:

String code1 = request.getParameter("code");

String code2 = (String) request.getSession().getAttribute("code");

request.getSession().removeAttribute("code");

if(!code1.equalsIgnoreCase(code2)){

request.setAttribute("msg", "验证码输入错误!");

request.getRequestDispatcher("/demo2/login.jsp").forward(request, response);

return ;

}

...

}

1.5.4    总结:

1.5.4.1  使用JS控制图片切换:

<script type="text/javascript">

function changeImg(){

document.getElementById("img1").src="/day11/CheckImgServlet?time="+new Date().getTime();

}

</script>

web-day11的更多相关文章

  1. Web大前端面试题-Day11

    86.如何获得高效的数据库逻辑结构? 从关系数据库的表中 删除冗余信息的过程 称为数据规范化, 是得到高效的关系型数据库表的逻辑结构 最好和最容易的方法. 规范化数据时应执行以下操作: 1.将数据库的 ...

  2. 撩课-Web大前端每天5道面试题-Day11

    1. 如何手写一个JQ插件? 方式一: $.extend(src) 该方法就是将src合并到JQ的全局对象中去: $.extend({ log: ()=>{alert('撩课itLike');} ...

  3. Java Web总结

    一.地址 客户端路径和服务端路径 表单:<form action="路径"></form> 超链接:<a href="路径"> ...

  4. python 之路,Day11(上) - python mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  5. Day11 - Mysql and ORM

    python 之路,Day11 - python mysql and ORM   本节内容 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令 创建数据库 ...

  6. day11(jsp入门&Cookie&HttpSession&一次性图片校验码)

    day11 JSP入门   1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. ...

  7. day11会话管理

    会话管理入门 2.1 生活中会话 我: 小张,你会跳小苹果码? 小张: 会,怎么了? 我: 公司年会上要表演节目,你教教我把 小张:没问题,一顿饭而已. 我: OK. ........ 在这次生活中的 ...

  8. servlet——web应用中路径问题

    target.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html ...

  9. web笔记全

    1.项目流程与数据库 1.课程体系 阶段1(服务器开发): 项目导入/数据库/JS基础/NodeJS 阶段2(前端核心技术): HTML/AJAX/CSS/bootstrap 阶段3(前端进阶技术): ...

  10. day11 四层负载均衡和http协议

    day11 四层负载均衡和http协议 四层负载均衡和七层负载均衡的区别 四层和七层负载均衡的区别 四层负载均衡数据包在底层就进行了分发,而七层负载均衡数据包则是在最顶层进行分发.由此可以看出,七层负 ...

随机推荐

  1. hdu 1558 (线段相交+并查集) Segment set

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1558 题意是在坐标系中,当输入P(注意是大写,我当开始就wa成了小写)的时候输入一条线段的起点坐标和终点坐 ...

  2. 最大子序列(java版)

    package com.algorithm.test; /** * 最大子序列 * @author LiFen * */ public class LargestSubsequence { publi ...

  3. vs视图引入命名空间设置方法

    解决: 1.@using在cshtml的最上面,加上一句: @using Puzzle.Framework.Common 2.在View文件夹下面的web.config里面加: <system. ...

  4. BZOJ1079或洛谷2476 [SCOI2008]着色方案

    一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...

  5. MAC/Xcode简单操作命令

    快捷键: command(windows) + c: 复制 command + V : 粘贴 command + x: 剪切(只在当前应用程序内有效) 在mac系统下表示剪切功能: 先command ...

  6. Tinyos学习笔记(三)

    读取Telosb内部传感器数据,并在计算机上显示. senseC.nc代码如下: #include "Timer.h" #include "sense.h" # ...

  7. Netty Reator(三)Reactor 模型

    Netty Reator(三)Reactor 模型 Netty 系列目录 (https://www.cnblogs.com/binarylei/p/10117436.html) 本文介绍 DC Sch ...

  8. Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器

    一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...

  9. Ionic学习

    1. 原来Http不能直接加在普通类里,下面的报错 import { Component } from '@angular/core'; import { NavController } from ' ...

  10. canvas绘图实现浏览器等待效果

    一:创建画布 <canvas width="600" height="600" id="canvas" style="bor ...