Servlet的Cookie技术

目录

点睛

Cookie关键点说明

实战


点睛

1 会话

用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。

2 有状态会话

举个例子,一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话。

3 一个网站,怎样证明你来过?

服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了,这个信件就是cookie。

服务端登记你来过了,下次你来的时候我来匹配你,这个登记就是session。

4 保存会话的两种技术

cookie:客户端技术,通过响应,请求来实现。

session:服务端技术,利用这个技术,可以保存用户的会话信息。我们可以把信息或者数据放在Session中。

5 常见场景

网站登录之后,你下次不用再登录了,第二次访问直接就上去了。

6 session和cookie的理解 

session被称为会话,不同于TCP/IP协议,HTTP协议是一种无状态的协议,也就是说,当一个客户端向服务器发出请求,服务器接收请求,并返回响应,这样一来一回之后,这个连接就结束了,服务器并不保存任何相关信息。

为了弥补这个缺陷,HTTP协议提出了session的概念。通过session,在Web页面进行跳转时,可以保存用户的状态信息,比如,在购物网站的不同商品页面跳转时,网站并不会让用户重复登录,因为用户的会话一致保存着,直到用户关闭浏览器。

但是,如果客户端长时间不向服务器发出请求,那么这个会话对象也会自动销毁,这个时间取决于服务器的设置,对于Tomcat来说,这个默认值是30分钟。当然这个值也可以通过程序修改。

session是客户端保留在服务端的信息。而服务端为了区分不同的客户端,用户都会自动为其分配一个session id的数据。

有一个Cookie是由服务器自动设置到客户端上的,自动设置到客户端上的内容实际上就是session id。

用户第一次访问服务器的时候,不会发送JSESSIONID数据,因为此时还没设置Cookie在客户端。当第二次访问的时候,因为之前已经设置了Cookie数据,所以之后就可以通过JSESSIONID进行比较,从而确定每一个用户是否是第一次访问。

session属性范围的特征在于,不管是客户端还是服务器端跳转,所设置的内容都会被保留,除非浏览器关闭。

Cookie关键点说明

1 从请求中拿到cookie

2 从服务器响应给客户端cookie

3 cookie关键API

Cookie[] cookies = req.getCookies(); // 获得cookie
cookie.getName(); // 获得cookie的key
cookie.getValue()  // 获得cookie的value
resp.addCookie(cookie); // 响应给客户端一个cookie
new Cookie("lastLoginTime", System.currentTimeMillis() + ""); // 创建一个cookie
cookie.setMaxAge(24 * 60 * 60); // 设置cookie的过期时间

4 cookie一般会保存在本地的用户目录appdata下

5 一个Cookie只能保存一个信息

6 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie

7 浏览器上限是300个cookie

8 Cookie的大小限制为4kb

9 删除Cookie

不设置有效期,关闭浏览器,自定失效。

设置有效期时间为0

10 编码和解码

URLEncoder.encode("游客", "utf-8");
URLDecoder.decode(cookie.getValue(),"utf-8");

实战

1 常规测试

package com.cakin;


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.io.PrintWriter;
import java.util.Date;


public class CookieDemo01 extends HttpServlet {
    /**
     * 功能描述:服务器告诉你,你来的时间,把这个时间封装未一个信件,你下次带来,我就知道你来了
     *
     * @param req  请求
     * @param resp 响应
     * @author cakin
     * @date 2020/6/9
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");


        PrintWriter out = resp.getWriter();
        // 服务端从客户端获取Cookie,返回的是数组,说明cookie可以返回多个
        Cookie[] cookies = req.getCookies();
        // 判断cookie是否存在
        if (cookies != null) {
            // 拿到前端送过来的cookie
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("lastLoginTime")) {
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write("上次访问的时间是:" + date.toLocaleString());
                }
            }
        } else {
            out.write("你是第一次来");
        }


        // 服务端给客户端cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(24 * 60 * 60);
        resp.addCookie(cookie);
    }


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

2 cookie马上过期

package com.cakin;


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 CookieDemo02 extends HttpServlet {
    /**
     * 功能描述:设置cookie为0,cookie马上过期
     *
     * @param req  请求
     * @param resp 响应
     * @author cakin
     * @date 2020/6/9
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 服务端给客户端cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }


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

3 解决中文乱码问题

package com.cakin;


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.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;


public class CookieDemo03 extends HttpServlet {
    /**
     * 功能描述:解决中文乱码问题
     *
     * @param req  请求
     * @param resp 响应
     * @author cakin
     * @date 2020/6/9
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");


        PrintWriter out = resp.getWriter();
        // 服务端从客户端获取Cookie,返回的是数组,说明cookie可以返回多个
        Cookie[] cookies = req.getCookies();
        // 判断cookie是否存在
        if (cookies != null) {
            // 拿到前端送过来的cookie
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("name")) {
                    // 解码,解决中文乱码问题
                    out.write("我是:" + URLDecoder.decode(cookie.getValue(),"utf-8"));
                }
            }
        } else {
            out.write("你是第一次来");
        }


        // 服务端给客户端cookie,先编码解决中文乱码问题
        Cookie cookie = new Cookie("name", URLEncoder.encode("游客", "utf-8"));
        resp.addCookie(cookie);
    }


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

4 配置文件

<?xml version="1.0" encoding="ISO-8859-1"?>

<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_3_1.xsd"
         version="3.1"
         metadata-complete="true">
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.cakin.loginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>cookieDemo1</servlet-name>
    <servlet-class>com.cakin.CookieDemo01</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cookieDemo1</servlet-name>
    <url-pattern>/cookie1</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>cookieDemo2</servlet-name>
    <servlet-class>com.cakin.CookieDemo02</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cookieDemo2</servlet-name>
    <url-pattern>/cookie2</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>cookieDemo3</servlet-name>
    <servlet-class>com.cakin.CookieDemo03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>cookieDemo3</servlet-name>
    <url-pattern>/cookie3</url-pattern>
  </servlet-mapping>
</web-app>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值