Cookie

1、Cookie 定义

这是JAVAWEB项目用来进行会话和状态 管理的重要工具,客户端第一次发请求到服务器,不会携带任何cookie数据。那么服务器会判断这是该会话的第一个请求,服务器就创建一个Cookie对象,随响应带回浏览器,浏览器将其保存在本地文件夹,下一次请求时,会携带该文件夹中的数据 ,服务器判断该数据和上次返回的数据一致,可知两次请求来自同一个会话

2、Session——HttpSession,

这表示一次会话,服务器和客户端之间通信默认的Cookie数据就是当前HttpSession会话的id,它是一个键值对

键:JSessinId

值:是一个16进制的唯一数值,每一个会话中的JSessionId都是一样的

代码:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(value = "/hellocookie")
public class HelloCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length > 0) {
            //已经发过请求
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        } else {
            System.out.println("没有cookie,您是第一次访问当前服务器");
            //为每一个浏览器创建JSessionID
            HttpSession session = req.getSession();//会话,如果浏览器关闭,那就没有

        }
    }
}

步骤:打开tomcat之后把 复制网址,然后把浏览器关掉

再次输入网址,发出请求,并多次刷新网页

IDEA获得相应

浏览器缓存清除:

知识点:

1、域对象

这是一种用来携带数据的对象,数据以键值对的形式从一个资源被带到了下一个资源

setAttribute(键,值)——存放数据

getAttibute(键)——根据传入的键获取对应的值

removeAttribute(键)——根据传入的键删除对应的键值对

常见域对象

①HttpServletRequest

一次请求

②HttpSession

一次会话(包含了多次请求和响应)浏览器的打开到关闭可以理解为一个会话

我们可以通过request请求调用geySession()获取

③ServletContext

整个Web应用

我们可以通过当前request请求调用getServletContext()获取当前Web应用的对象

3、自定义Cookie对象

我们可以自己创建Cookie对象,我哦们使用new Cookie构造方法,传入键和值即可

然后我们需要将自定义的Cookie对象绑定到response中,使用HttpServletResponse.addCookies(cookie对象)即可

格式:

   Cookie cookie = new Cookie("myKey", "myValue");//新建一个Cookie对象
            resp.addCookie(cookie);把新建的对象绑到原有的cookie对象上

代码:

package com.iweb.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(value = "/hellocookie")
public class HelloCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length > 0) {
            //已经发过请求
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        } else {
            System.out.println("没有cookie,您是第一次访问当前服务器");
            //为每一个浏览器创建JSessionID
            HttpSession session = req.getSession();//会话,如果浏览器关闭,那就没有
            Cookie cookie = new Cookie("myKey", "myValue");
            resp.addCookie(cookie);
        }

    }
}

输出结果:

以上都是Session ——会话级别的Cookie

4、持久级别的Cookie

Cookie默认都是会话级别,随浏览器关闭而被删除,我们可以调用setMaxAge(秒数)将其设置为持久级别,那么它将不受浏览器开关控制,等有效期到了,它自动删除

格式:

 Cookie cookie = new Cookie("myKey", "myValue");
            cookie.setMaxAge(30);

代码:

package com.iweb.test;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet(value = "/hellocookie")
public class HelloCookie extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length > 0) {
            //已经发过请求
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName() + ":" + cookie.getValue());
            }
        } else {
            System.out.println("没有cookie,您是第一次访问当前服务器");
            //为每一个浏览器创建JSessionID
            HttpSession session = req.getSession();//会话,如果浏览器关闭,那就没有
            Cookie cookie = new Cookie("myKey", "myValue");
            cookie.setMaxAge(30);
            resp.addCookie(cookie);
        }

    }
}

运行结果:30秒后自动关闭

注意:

我们可以通过setMaxAge(0)来清除该cookie

如果传入负数作为setMaxAge()的参数,则表示会话级别的cookie

应用:

利用Cookie来写自动登录

大致思路:存两个Cookie对象,一个键值:账号:账号值

密码:密码值

cookie1.setMaxAge=

账号=第一个cookie.

package com.iweb.test;
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;


@WebServlet(value = "*.user")
public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("html/text");

        String path = req.getServletPath();
        switch (path) {
            case "/login.user": {
                login(req, resp);
                break;
            }
            case "/exit.user": {
                logout1(req, resp);
                break;
            }
            default:
                break;
        }
    }

    private void logout1(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Cookie[] cookies = req.getCookies();
        if (cookies != null && cookies.length > 0) {//如果已经有cookie文件
            for (Cookie cookie : cookies) {
                if ("username".equals(cookie.getName())) {
                    cookie.setMaxAge(0);
                    resp.addCookie(cookie);
                }
            }
        }
        resp.sendRedirect(req.getContextPath() + "/login.html");
    }

    private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String username = req.getParameter("username");
        if (username != null && username != "") {//当账号名不为空
            Cookie userNameCookie = new Cookie("username", username);//创建一一个新的cookie 来存键值对
            userNameCookie.setMaxAge(3000);//寿命30s
            resp.addCookie(userNameCookie);
        } else {//账号为空
            Cookie[] cookies = req.getCookies();
            if (cookies != null && cookies.length > 0) {//如果已经有cookie文件
                for (Cookie cookie : cookies) {
                    if ("username".equals(cookie.getName())) {
                        username = cookie.getValue();//读取cookie文件里存的账号 username是以前
                    }
                }
            }

        }
        if (username != null && !"".equals(username)) {
            resp.sendRedirect(req.getContextPath() + "/success.html");

        } else {
            resp.sendRedirect(req.getContextPath() + "/login.html");
        }
    }
}

注意:在html文件中 超链接或者 from post表单提交写的没有斜杠

在servlet path中写user

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值