JavaWeb 黑马2019 day16_Cookie&Session

JavaWeb

第一章 Cookie技术(重要)

今日内容

1,之前学习了WEB核心技术servlet,request和response

2,今天接着学习WEB核心技术,第一部分会话技术,第二部分是JSP

3,会话技术包含了两部分内容,cookie和session

4,我们今天先学习cookie,然后学习JSP,最后再来学习Session,因为我们的JSP要充当叶一个页面展示层的作用

会话技术_概述

1,会话是一门非常重要的技术,在服务器端开发过程中,他可以解决非常重要的问题

2,会话和我们生活中的谈话或者是交谈非常的类似,一次会话就喝我们的一次谈话是一个意思

3,HTTP每次的请求和响应都是独立的,不能共享数据,交换状态,会话就可以解决这个问题

4,其他的编程语言也有会话技术的实现,就不再叫cookie和session了

5,客户端会话技术,就是把数据存到客户端的,服务器端会话技术,其实就是把数据存到服务器端,我们叫做服务器端会话技术

会话技术_Cookie_快速入门

1,学习了会话技术的基本概念和功能之后,接下来我们就来学习第一门会话技术,客户端会话技术,他的体现是cookie

2,每次的servlet都要写一些重复的代码,IDEA里边是可以修改servlet的模版的

package cn.itcast.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * Cookie快速入门
 *
 */

@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c = new Cookie("msg","hello");
        //2.发送Cookie
        response.addCookie(c);
    }

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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * Cookie快速入门
 *
 */

@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //3. 获取Cookie
        Cookie[] cs = request.getCookies();
        //获取数据,遍历Cookies
        if(cs != null){
            for (Cookie c : cs) {
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }
    }

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

3,同一个浏览器访问,会实现数据共享

会话技术_Cookie_原理分析

1,cookie快速入门的代码还是很简单的,但是深入的理解cookie的技术,使用,原理

2,JavaWeb封装好的API来做的操作cookie,服务器帮我们做了很多的事,HTTP协议和浏览器帮我们做了很多的事

3,我们需要关注的非常的少,通过API去发送cookie,以及通过API来接受cookie,现在我们可以通过抓包工具来看看是不是这么些头在作用

4,浏览器关了,会话就全部结束了

 

5,以上就是cookie的原理,知道了这个原理之后,以后就可以更好的来使用cookie消息了

会话技术_Cookie_细节1_发送多个Cookie

1,介绍完cookie的实现原理,我们发现cookie其实是基于,响应头set-cookie和请求头cookie来实现的

2,下面我们来进行细节性的学习,可以学习到cookie的一些规则以及一些常用的API

3,cookie在浏览器中保存多长时间?

4,不是只有访问demo2才可以获取这些cookie,访问其他的也可以,再次访问demo1也是有的

package cn.itcast.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * Cookie快速入门
 *
 */

@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","hello");
        Cookie c2 = new Cookie("name","zhangsan");
        //2.发送Cookie
        response.addCookie(c1);
        response.addCookie(c2);
    }

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

会话技术_Cookie_细节2_Cookie存活时间

1,想要持久化,就需要文件了,设置cookie的生命周期,使他来持久化的存储

2,默认就是负数,不需要单独设置

package cn.itcast.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * Cookie快速入门
 *
 */

@WebServlet("/cookieDemo4")
public class CookieDemo4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","setMaxAge");
        //2.设置cookie的存活时间
        //c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
        //c1.setMaxAge(-1);
        //c1.setMaxAge(300);
        c1.setMaxAge(0);//删除Cookie
        //3.发送Cookie
        response.addCookie(c1);
    }

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

会话技术_Cookie_细节3_Cookie存储中文

1,tomcat 8之前的版本,建议使用URL编码就是%E8类似这种的,才可以显示中文

会话技术_Cookie_细节4_Cookie共享

package cn.itcast.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * Cookie快速入门
 *
 */

@WebServlet("/cookieDemo5")
public class CookieDemo5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        Cookie c1 = new Cookie("msg","你好");
        //设置path,让当前服务器下部署的所有项目共享Cookie信息
        c1.setPath("/");

        //3.发送Cookie
        response.addCookie(c1);
    }

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

1,新闻的百度和贴吧的百度不可能部署在同一台tomcat的服务器上,如果同一台,不可能支持这么大的访问两

2,他们之间的cookie 怎么共享呢?

3,将来我们学习了电商项目之后,如果要去做一些域名的映射和分布式部署,那么这个点可能会用得到,这儿先不掩饰了,大家有个印象就可以了

会话技术_Cookie_特点&作用

1,介绍文cookie的使用方式和他的细节性问题之后,下来我们来聊一聊cookie的最后一个问题,cookie的特点

2,掌握了cookie的特点,你就知道了cookie到底有什么作用

3,数据存在客户端还是存在服务器他的差异还是比较大的,存储在服务器得话,服务器的防卫级别,安全级别都非常的高,存在服务器的数据安全性就要高很多,存在客户端的数据很容易丢失,也很容易被篡改,所以存在客户端的数据不是那么安全

4,下面看一下浏览器存储的cookie,这个地方指的是持久化存储,就是存储在硬盘上的

5,他可以在我设置之后,把我设置的这些信息,以cookie的形式存储到我的浏览器,下次我再次访问的时候,他可以拿到我的cookie信息完成我的设置信息

6,我第一次设置之后,服务器就会把这些cookie信息发送给浏览器保存,下一次只要是我带着这些cookie来了,服务器就知道是哪些设置了,显示的时候就相对的显示,这就是不登陆的时候,身份识别

7,如果是登陆的情况,那么这些设置可以放到数据库里面存储,那我我登陆以后,服务器就知道是我来了

8,以上cookie的作用和特点我们就介绍完了,最后我们来做一个案例

会话技术_Cookie_案例_分析

1,案例:记住上一次的访问时间

2,这样的案例在我们的服务器开发过程中,网站开发过程中经常我们会见到这样的案例

3,比方说我们登陆了这个网站之后,会自动告诉你,上一次是什么时候登陆的

4,案例需求:

会话技术_Cookie_案例_代码实现

1,分析完之后,我们来建立一个servlet

2,invalid character 32 代表空格,5XX代表服务器端错误

3,问题就是,原来cookie支持中文数字了,但是对于这种特殊的字符,他还是不支持

4,需要了解一下URL编码了,tomcat8支持中文了,但是对于特殊字符还是不支持的,建议使用URL编码

5,只有addcookie需要编码,getwriter.write不需要

package cn.itcast.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 在服务器中的Servlet判断是否有一个名为lastTime的cookie
 1. 有:不是第一次访问
     1. 响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:20
     2. 写回Cookie:lastTime=2018年6月10日11:50:01
 2. 没有:是第一次访问
     1. 响应数据:您好,欢迎您首次访问
     2. 写回Cookie:lastTime=2018年6月10日11:50:01
 */

@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的消息体的数据格式以及编码
        response.setContentType("text/html;charset=utf-8");

        //1.获取所有Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;//没有cookie为lastTime
        //2.遍历cookie数组
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                //3.获取cookie的名称
                String name = cookie.getName();
                //4.判断名称是否是:lastTime
                if("lastTime".equals(name)){
                    //有该Cookie,不是第一次访问

                    flag = true;//有lastTime的cookie

                    //设置Cookie的value
                    //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
                    Date date  = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    System.out.println("编码前:"+str_date);
                    //URL编码
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    System.out.println("编码后:"+str_date);
                    cookie.setValue(str_date);
                    //设置cookie的存活时间
                    cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
                    response.addCookie(cookie);


                    //响应数据
                    //获取Cookie的value,时间
                    String value = cookie.getValue();
                    System.out.println("解码前:"+value);
                    //URL解码:
                    value = URLDecoder.decode(value,"utf-8");
                    System.out.println("解码后:"+value);
                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");
                    break;

                }
            }
        }


        if(cookies == null || cookies.length == 0 || flag == false){
            //没有,第一次访问

            //设置Cookie的value
            //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
            Date date  = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = sdf.format(date);
            System.out.println("编码前:"+str_date);
            //URL编码
            str_date = URLEncoder.encode(str_date,"utf-8");
            System.out.println("编码后:"+str_date);

            Cookie cookie = new Cookie("lastTime",str_date);
            //设置cookie的存活时间
            cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
            response.addCookie(cookie);

            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
        }
    }

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

1,cookie的名称如果相同得话,值会被覆盖掉

2,如果cookie如果要存储一些特殊的字符,我们需要对他进行一些URL的编解码

第二章 Jsp入门(理解)

第三章 Session技术(重要)










JSP_概念
JSP_原理
JSP_脚本
JSP_入门学习
JSP_案例_改造Cookie案例
会话技术_Session_快速入门
会话技术_Session_原理分析
会话技术_Session_细节1
会话技术_Session_细节2
会话技术_Session_细节3_session销毁
会话技术_Session_特点
案例_验证码_需求&分析
案例_验证码_代码实现
案例_验证码_细节处理

猜你喜欢

转载自www.cnblogs.com/lisa-blog/p/12902715.html