javaWeb-6-Cookie

目录

1、会话机制

2、Cookie机制

2.1 什么是Cookie

2.2 如何创建Cookie与使用Cookie

2.2.1 创建Cookie与使用Cookie的代码演示-项目结构图-API全集

2.2.2 编写一个Servlet处理器-处理GET请求

2.2.2 在web.xml文件中配置动态资源Servlet处理器的访问路径

2.2.3 编写一个前端交互页面

2.2.4 测试-前端发起请求:创建Cookie

2.2.5 测试-后端处理请求:创建Cookie并返回Cookie

2.3 如何获取Cookie

2.3.1 编写一个Servlet处理器与获取指定Cookie对象的工具类

2.3.2 在web.xml文件中配置Servlet处理器的访问路径

2.3.3 编写前端页面

2.3.4 前端发起请求,服务器端看测试结果

2.4 Cookie值的修改

2.4.1 方案一:修改cookie的Servlet处理器:updateCookie方法

2.4.2 方案二:修改cookie的Servlet处理器:updateCookie方法

2.5 Cookie的生命控制

2.5.1 Servlet处理器-生命控制的方法 

2.5.2 前端页面-HTML

2.6 Cookie的有效路径Path的设置

2.6.1 setPath()方法的代码演示

2.7 Cookies练习-面用户名登陆演示-项目结构

2.7.1 编写一个登陆的Servlet处理器

2.7.2 在web.xml文件中配置Servlet处理器的访问路径

2.7.3 编写一个前端登陆页面jsp

2.7.4 测试

3 谷歌浏览器如何查看Cookie:MAC中:fn+f12

1、会话机制

(1)会话:一次会话中包含多次请求和多次响应。注:一次会话,表示浏览器第一次给服务器发送请求,会话建立,直到有一方断开为止,才表示此次会话结束。

(2)功能:在一次会话的多次请求之间是共享数据的。

(3)方式:A:客户端会话技术:Cookie。B:服务器端会话技术:Session。

2、Cookie机制

2.1 什么是Cookie

(1)cookie翻译过来是饼干的意思。

(2)cookie是服务器端通知客户端保存键值对的一种会话技术。

(3)客户端有了cookie之后,每次请求都可以把该cookie发送给服务器,在服务器中可以解析该Cookie内容。

(4)每个cookie的大小不能超过4KB。

2.2 如何创建Cookie与使用Cookie

创建与使用步骤:

(1)在服务器端创建Cookie对象,对象中设置准备绑定的数据,数据的形式是键值对 :new Cookie(String name, String value);

(2)客户端向服务器端发送HTTP请求后,服务器通过把Cookie对象设置在响应对象HttpServletResponse对象中回传给向客户端:response.addCookie(Cookie cookie);

(3)客户端接收到Cookie对象后,便可以使用了。当它再次发送请求的时候,会携带这个Cookie,服务器也会继续获取从客户端发来的Cookie对象:Cookie[ ] request.getCookies( );

(4)服务器得到Cookie对象之后,使用getName( )与getValue( )方法得到Cookie对象中的数据,从而继续进行业务操作。

2.2.1 创建Cookie与使用Cookie的代码演示-项目结构图-API全集

  

2.2.2 编写一个Servlet处理器-处理GET请求

package com.wind.servlet;

import javax.servlet.ServletException;
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.lang.reflect.Method;

/**
    //测试1:创建cookie对象
 */
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID = 6898486426877817687L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求中的中文乱码问题,一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中的中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");
        try {
            //反射方式:获取action业务鉴别字符串,获取相应的业务方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(new CookieServlet(), request, response);
            System.out.println(method);
        } catch (Exception e) {
            System.out.println("CookieServlet error..." + e);
        }
    }

    //测试1:创建cookie对象
    private void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.创建Cookie对象,并且向对象中设置值
        Cookie cookie1 = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.向响应中写入Cookie,通知客户端保存Cookie对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.getWriter().write("cookie创建成功");
    }
}

2.2.2 在web.xml文件中配置动态资源Servlet处理器的访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.wind.servlet.CookieServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

</web-app>

2.2.3 编写一个前端交互页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <title>Cookie</title>
    <base href="http://localhost:8080/13_cookie_session/">
    <style type="text/css">
        ul li {
            list-style: none;
        }
    </style>
</head>
<body>
<iframe name="target" width="500" height="200" style="..."></iframe>
<div style="...">
    <ul>
        <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
        <li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
        <li><a href="" target="target">Cookie的修改</a></li>
        <li>Cookie的生存周期</li>
        <li>
            <ul>
                <li><a href="" target="target">Cookie的默认存活时间</a></li>
                <li><a href="" target="target">Cookie立即删除</a></li>
                <li><a href="" target="target">Cookie存活3600秒</a></li>
            </ul>
        </li>
        <li><a href="" target="target">Cookie的路径设置</a></li>
        <li><a href="" target="target">Cookie的用户免登陆练习</a></li>
    </ul>
</div>
</body>
</html>

2.2.4 测试-前端发起请求:创建Cookie

(1)前端发起一个【cookie的创建】HTTP请求之后,服务器端通过反射调用创建cookie对象的方法,创建cookie对象,并且向对象中设置了两个值“key1=value1、key2=value2”,然后在响应中写入这个cookie对象,通知客户端保存cookie对象。

(2)随后,在Chrome浏览器中便可以看到服务器端设置的cookie数据。

(3)一个是直接在请求接口中看到cookie数据。另一个是在Application中看到cookie数据。

2.2.5 测试-后端处理请求:创建Cookie并返回Cookie

2.3 如何获取Cookie

2.3.1 编写一个Servlet处理器与获取指定Cookie对象的工具类

(1)Servlet处理器:request.getCookies( );

package com.wind.servlet;

import javax.servlet.ServletException;
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.lang.reflect.Method;

/**
    //测试2:获取所有的cookie对象,与指定的cookie对象
 */
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID = 6898486426877817687L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求中的中文乱码问题,一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中的中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");
        try {
            //反射方式:获取action业务鉴别字符串,获取相应的业务方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(new CookieServlet(), request, response);
            System.out.println(method);
        } catch (Exception e) {
            System.out.println("CookieServlet error..." + e);
        }
    }

    //测试1:创建cookie对象
    private void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.创建Cookie对象,并且向对象中设置值
        Cookie cookie1 = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.向响应中写入Cookie,通知客户端保存Cookie对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.getWriter().write("cookie创建成功");
    }

    //测试2:获取所有的cookie对象,与指定的cookie对象
    private void getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //3.服务器端获取从客户端发送过来的cookie数据
        Cookie[] cookies = request.getCookies();
        //4.服务器端获取Cookie对象的值
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie != null) {
                    response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
                }
            }
        }
        //5.如果只想要某一个cookie,则需要这样做
        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        response.getWriter().write("找到了我想要的Cookie[" + iWantCookie.getName() + "=" + iWantCookie.getValue() + "]");
    }
}

(2)获取指定Cookie对象的工具类:

package com.wind.servlet;

import javax.servlet.http.Cookie;

public class CookieUtils {
    public static Cookie findCookie(String name, Cookie[] cookies) {
        Cookie iWantCookie = null;
        if (name != null && cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (name.equals(cookie.getName())) {
                    iWantCookie = cookie;
                    break;
                }
            }
        }
        return iWantCookie;
    }
}

2.3.2 在web.xml文件中配置Servlet处理器的访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.wind.servlet.CookieServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

</web-app>

2.3.3 编写前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <title>Cookie</title>
    <base href="http://localhost:8080/13_cookie_session/">
    <style type="text/css">
        ul li {
            list-style: none;
        }
    </style>
</head>
<body>
<iframe name="target" width="500" height="200" style="..."></iframe>
<div style="...">
    <ul>
        <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
        <li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
        <li><a href="" target="target">Cookie的修改</a></li>
        <li>Cookie的生存周期</li>
        <li>
            <ul>
                <li><a href="" target="target">Cookie的默认存活时间</a></li>
                <li><a href="" target="target">Cookie立即删除</a></li>
                <li><a href="" target="target">Cookie存活3600秒</a></li>
            </ul>
        </li>
        <li><a href="" target="target">Cookie的路径设置</a></li>
        <li><a href="" target="target">Cookie的用户免登陆练习</a></li>
    </ul>
</div>
</body>
</html>

2.3.4 前端发起请求,服务器端看测试结果

(1)首先,点击【Cookie的创建】,在服务器端创建cookie对象,并设置cookie值,然后吐给客户端保存。

(2)然后,点击【Cookie的获取】,客户端再次访问服务器,此时,客户端会携带着刚才创建好的cookie对象送到服务器端,服务器端可以直接查看。

(3)服务器查看到的结果是:

2.4 Cookie值的修改

方案一:

(1)先创建一个需要修改的同名的cookie对象。

(2)使用cookie的构造器给这个需要修改的cookie的key赋予一个新的value值。

(3)调用response.addCookie( cookie ); 通知客户端保存修改。

2.4.1 方案一:修改cookie的Servlet处理器:updateCookie方法

package com.wind.servlet;

import javax.servlet.ServletException;
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.lang.reflect.Method;

/**
    //测试3.cookie的修改
 */
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID = 6898486426877817687L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求中的中文乱码问题,一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中的中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");
        try {
            //反射方式:获取action业务鉴别字符串,获取相应的业务方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(new CookieServlet(), request, response);
            System.out.println(method);
        } catch (Exception e) {
            System.out.println("CookieServlet error..." + e);
        }
    }

    //测试1:创建cookie对象
    private void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.创建Cookie对象,并且向对象中设置值
        Cookie cookie1 = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.向响应中写入Cookie,通知客户端保存Cookie对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.getWriter().write("cookie创建成功");
    }

    //测试2:获取cookie对象
    private void getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //3.服务器端获取从客户端发送过来的cookie数据
        Cookie[] cookies = request.getCookies();
        //4.服务器端获取Cookie对象的值
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie != null) {
                    response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
                }
            }
        }
        //5.如果只想要某一个cookie,则需要这样做
        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        response.getWriter().write("找到了我想要的Cookie[" + iWantCookie.getName() + "=" + iWantCookie.getValue() + "]");
    }

    //测试3.cookie的修改
    private void updateCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.先创建一个需要修改的同名的cookie
        //2.然后通过cookie的构造器重新给需要修改的cookie的key赋予一个新的value值
        Cookie cookie = new Cookie("key1", "newValue1");
        //3.写会到响应中
        response.addCookie(cookie);
        response.getWriter().write("修改了我想要修改的Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]");
    }
}

2.4.2 方案二:修改cookie的Servlet处理器:updateCookie方法

方案一:

(1)先查找到需要修改的cookie对象。

(2)调用setValue()方法给这个key赋予新的值。

(3)调用response.addCookie( cookie ); 通知客户端保存修改。

package com.wind.servlet;

import javax.servlet.ServletException;
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.lang.reflect.Method;

/**
    //测试3.cookie的修改
 */
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID = 6898486426877817687L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求中的中文乱码问题,一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中的中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");
        try {
            //反射方式:获取action业务鉴别字符串,获取相应的业务方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(new CookieServlet(), request, response);
            System.out.println(method);
        } catch (Exception e) {
            System.out.println("CookieServlet error..." + e);
        }
    }

    //测试1:创建cookie对象
    private void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.创建Cookie对象,并且向对象中设置值
        Cookie cookie1 = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.向响应中写入Cookie,通知客户端保存Cookie对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.getWriter().write("cookie创建成功");
    }

    //测试2:获取cookie对象
    private void getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //3.服务器端获取从客户端发送过来的cookie数据
        Cookie[] cookies = request.getCookies();
        //4.服务器端获取Cookie对象的值
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie != null) {
                    response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
                }
            }
        }
        //5.如果只想要某一个cookie,则需要这样做
        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        response.getWriter().write("找到了我想要的Cookie[" + iWantCookie.getName() + "=" + iWantCookie.getValue() + "]");
    }

    //测试3.cookie的修改
    private void updateCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //方案一:
        //1.先创建一个需要修改的同名的cookie
        //2.然后通过cookie的构造器重新给需要修改的cookie的key赋予一个新的value值
        Cookie cookie = new Cookie("key1", "newValue1");
        //3.写回到响应中
        response.addCookie(cookie);
        response.getWriter().write("修改了我想要修改的Cookie1[" + cookie.getName() + "=" + cookie.getValue() + "]");

        //方案二:
        Cookie[] cookies = request.getCookies();
        Cookie cookie2 = CookieUtils.findCookie("key2", cookies);
        if (cookie2 != null) {
            cookie2.setValue("newValue2");
            response.addCookie(cookie2);
            response.getWriter().write("修改了我想要修改的Cookie2[" + cookie2.getName() + "=" + cookie2.getValue() + "]");
        }
    }

}

2.5 Cookie的生命控制

cookie的生命控制,是指管理cookie何时销毁。

使用的是方法:setMaxAge( 参数 )

(1)参数=正数:表示在指定的秒数后过期。

(2)参数=0:表示浏览器一关闭,cookie即被删除(默认值是-1)。

(3)参数=负数:表示马上删除cookie。

2.5.1 Servlet处理器-生命控制的方法 

package com.wind.servlet;

import javax.servlet.ServletException;
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.lang.reflect.Method;

/**
    //测试4.测试cookie的默认过期时间
    //测试5.测试马上删除cookie
    //测试6.测试cookie的存活时间为60s
 */
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID = 6898486426877817687L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求中的中文乱码问题,一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中的中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");
        try {
            //反射方式:获取action业务鉴别字符串,获取相应的业务方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(new CookieServlet(), request, response);
            System.out.println(method);
        } catch (Exception e) {
            System.out.println("CookieServlet error..." + e);
        }
    }

    //测试1:创建cookie对象
    private void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.创建Cookie对象,并且向对象中设置值
        Cookie cookie1 = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.向响应中写入Cookie,通知客户端保存Cookie对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.getWriter().write("cookie创建成功");
    }

    //测试2:获取cookie对象
    private void getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //3.服务器端获取从客户端发送过来的cookie数据
        Cookie[] cookies = request.getCookies();
        //4.服务器端获取Cookie对象的值
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie != null) {
                    response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
                }
            }
        }
        //5.如果只想要某一个cookie,则需要这样做
        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        response.getWriter().write("找到了我想要的Cookie[" + iWantCookie.getName() + "=" + iWantCookie.getValue() + "]");
    }

    //测试3.cookie的修改
    private void updateCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //方案一:
        //1.先创建一个需要修改的同名的cookie
        //2.然后通过cookie的构造器重新给需要修改的cookie的key赋予一个新的value值
        Cookie cookie = new Cookie("key1", "newValue1");
        //3.写回到响应中
        response.addCookie(cookie);
        response.getWriter().write("修改了我想要修改的Cookie1[" + cookie.getName() + "=" + cookie.getValue() + "]");

        //方案二:
        Cookie[] cookies = request.getCookies();
        Cookie cookie2 = CookieUtils.findCookie("key2", cookies);
        if (cookie2 != null) {
            cookie2.setValue("newValue2");
            response.addCookie(cookie2);
            response.getWriter().write("修改了我想要修改的Cookie2[" + cookie2.getName() + "=" + cookie2.getValue() + "]");
        }
    }

    //测试4.测试cookie的默认过期时间
    private void defaultLife(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie cookie = new Cookie("defaultLife", "defaultLife");
        //默认是:浏览器一关闭,cookie即被删除了(需要等待浏览器关闭)
        cookie.setMaxAge(-1);
        response.addCookie(cookie);
    }

    //测试5.测试马上删除cookie
    private void deleteNow(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        //1.先找到你要删除的cookie
        Cookie cookie1 = CookieUtils.findCookie("key1", cookies);
        if (cookie1 != null) {
            //2.调用setMaxAge方法设置过期时间
            //设置0,表示cookie被马上删除,都不需要等待浏览器关闭
            cookie1.setMaxAge(0);
            //3.回传给客户端
            response.addCookie(cookie1);
            response.getWriter().write("key1的cookie1已经被删除了");
        }
    }

    //测试6.测试cookie的存活时间为60s
    private void life60(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        Cookie cookie = new Cookie("life60", "life60");
        //设置cookie的存活时间为60s
        cookie.setMaxAge(60);
        response.addCookie(cookie);
    }

}

2.5.2 前端页面-HTML

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="Expires" content="0">
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <title>Cookie</title>
    <base href="http://localhost:8080/13_cookie_session/">
    <style type="text/css">
        ul li {
            list-style: none;
        }
    </style>
</head>
<body>
<iframe name="target" width="500" height="200" style="..."></iframe>
<div style="...">
    <ul>
        <li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
        <li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
        <li><a href="cookieServlet?action=updateCookie" target="target">Cookie的修改</a></li>
        <li>Cookie的生存周期</li>
        <li>
            <ul>
                <li><a href="cookieServlet?action=defaultLife" target="target">Cookie的默认存活时间</a></li>
                <li><a href="cookieServlet?action=deleteNow" target="target">Cookie立即删除</a></li>
                <li><a href="cookieServlet?action=life60" target="target">Cookie存活60秒</a></li>
            </ul>
        </li>
        <li><a href="" target="target">Cookie的路径设置</a></li>
        <li><a href="" target="target">Cookie的用户免登陆练习</a></li>
    </ul>
</div>
</body>
</html>

2.6 Cookie的有效路径Path的设置

2.6.1 setPath()方法的代码演示

package com.wind.servlet;

import javax.servlet.ServletException;
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.lang.reflect.Method;

/**
    //测试7.测试cookie的path属性
 */
public class CookieServlet extends HttpServlet {

    private static final long serialVersionUID = 6898486426877817687L;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决POST请求中的中文乱码问题,一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");
        //解决响应中的中文乱码问题
        response.setContentType("text/html; charset=UTF-8");

        String action = request.getParameter("action");
        try {
            //反射方式:获取action业务鉴别字符串,获取相应的业务方法
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(new CookieServlet(), request, response);
            System.out.println(method);
        } catch (Exception e) {
            System.out.println("CookieServlet error..." + e);
        }
    }

    //测试1:创建cookie对象
    private void createCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1.创建Cookie对象,并且向对象中设置值
        Cookie cookie1 = new Cookie("key1", "value1");
        Cookie cookie2 = new Cookie("key2", "value2");
        //2.向响应中写入Cookie,通知客户端保存Cookie对象
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        response.getWriter().write("cookie创建成功");
    }

    //测试2:获取cookie对象
    private void getCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //3.服务器端获取从客户端发送过来的cookie数据
        Cookie[] cookies = request.getCookies();
        //4.服务器端获取Cookie对象的值
        if (cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                if (cookie != null) {
                    response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
                }
            }
        }
        //5.如果只想要某一个cookie,则需要这样做
        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);
        response.getWriter().write("找到了我想要的Cookie[" + iWantCookie.getName() + "=" + iWantCookie.getValue() + "]");
    }

    //测试3.cookie的修改
    private void updateCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //方案一:
        //1.先创建一个需要修改的同名的cookie
        //2.然后通过cookie的构造器重新给需要修改的cookie的key赋予一个新的value值
        Cookie cookie = new Cookie("key1", "newValue1");
        //3.写回到响应中
        response.addCookie(cookie);
        response.getWriter().write("修改了我想要修改的Cookie1[" + cookie.getName() + "=" + cookie.getValue() + "]");

        //方案二:
        Cookie[] cookies = request.getCookies();
        Cookie cookie2 = CookieUtils.findCookie("key2", cookies);
        if (cookie2 != null) {
            cookie2.setValue("newValue2");
            response.addCookie(cookie2);
            response.getWriter().write("修改了我想要修改的Cookie2[" + cookie2.getName() + "=" + cookie2.getValue() + "]");
        }
    }

    //测试4.测试cookie的默认过期时间
    private void defaultLife(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie cookie = new Cookie("defaultLife", "defaultLife");
        //默认是:浏览器一关闭,cookie即被删除了(需要等待浏览器关闭)
        cookie.setMaxAge(-1);
        response.addCookie(cookie);
    }

    //测试5.测试马上删除cookie
    private void deleteNow(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        //1.先找到你要删除的cookie
        Cookie cookie1 = CookieUtils.findCookie("key1", cookies);
        if (cookie1 != null) {
            //2.调用setMaxAge方法设置过期时间
            //设置0,表示cookie被马上删除,都不需要等待浏览器关闭
            cookie1.setMaxAge(0);
            //3.回传给客户端
            response.addCookie(cookie1);
            response.getWriter().write("key1的cookie1已经被删除了");
        }
    }

    //测试6.测试cookie的存活时间为60s
    private void life60(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        Cookie cookie = new Cookie("life60", "life60");
        //设置cookie的存活时间为60s
        cookie.setMaxAge(60);
        response.addCookie(cookie);
    }

    //测试7.测试cookie的path属性
    private void testPath(HttpServletRequest request, HttpServletResponse response) throws IOException {
        Cookie[] cookies = request.getCookies();
        Cookie cookie = new Cookie("testPath", "testPath");
        //request.getContextPath():得到工程路径
        //request.getContextPath() + "/abc":/工程路径/abc
        cookie.setPath(request.getContextPath() + "/abc");
        response.addCookie(cookie);
        response.getWriter().write("创建了一个带有/abc这个path路径属性的cookie");
    }

}

2.7 Cookies练习-面用户名登陆演示-项目结构

2.7.1 编写一个登陆的Servlet处理器

package com.wind.servlet;

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

/**
免用户名登陆测试
 */
public class LoginServlet extends HttpServlet {

    private static final long serialVersionUID = 8426663113333075280L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        if ("abc".equals(username) && "123".equals(password)) {
            Cookie cookie = new Cookie("username", username);
            //当前cookie60秒内有效
            cookie.setMaxAge(60);
            response.addCookie(cookie);
            System.out.println("登陆 成功");
        } else {
            System.out.println("登陆 失败");
        }
    }
}

2.7.2 在web.xml文件中配置Servlet处理器的访问路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.wind.servlet.LoginServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>

</web-app>

2.7.3 编写一个前端登陆页面jsp

<%--
  Created by IntelliJ IDEA.
  Date: 2020/12/23
  Time: 23:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${cookie}
<form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
    用户名:<input type="text" name="username" id="${cookie.username.value}"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登陆">
</form>
</body>
</html>

2.7.4 测试

略。

3 谷歌浏览器如何查看Cookie:MAC中:fn+f12

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/111466656
今日推荐