JavaWeb-Cookie基础举例

Cookie

1.会话

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

有状态的会话:例如一个学生来过咱们班的教室,下次再来的时候,我们就能记住他来过。这个就是有状态的会话。

Eg:

一个网站如何证明你来过?

客户端<——>服务端

1.服务端会给客户一个 信件,客户端下次访问的时候,带上这个信件,就可以被认出来了。(Cookie)。

2.服务器登记你来过了,下次再访问的时候,会自动匹配你(Session)。

2保存会话的两种技术:

Cookie:

  • 客户端技术(具有响应,请求)

Session:

  • 服务器技术,利用此技术,我们可以保存,用户的会话信息,我们可以把信息或者数据放在Session中。

常见场景:

网站登录后,关闭浏览器再打开此网页,一般情况下第二次进入都不用再次登录了,账户信息会被记住。

3.Cookie

总结:

1.从请求中拿到Cookie信息。

2.服务器响应给客户端Cookie。

在这里插入图片描述

代码总结:

Cookie[] cookies = req.getCookies();//Cookie的获取。
	Cookie cookie = cookies[i];
	cookie.getName()//获取Cookie中的Key
    cookie.getValue()//获取Cookie中的Value
new Cookie("Last_LoginTime", System.currentTimeMillis() + "");//新建一个Cookie
	cookie.setMaxAge(24*60*60)//设置Cookie的有效期,这里24*60*60表示一天
resp.addCookie(cookie);//响应给客户端一个Cookie

举例:

Servlet:

package com.edwin.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 javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
 * @author Edwin D
 * @date 2020.6.6 上午 8:28
 */
//保存用户上次访问的时间
public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        服务器会保存你上次来时的时间,把这个时间封装成一个信件,下次你带来,就会知道是你来了。
//        解决中文乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");//解决网页页面乱码

        PrintWriter out = resp.getWriter();

//        Cookie需要服务器从客户端获取。
        Cookie[] cookies = req.getCookies();
//        自动创建时用数组,说明Cookie可能存在多个。

//        判断Cookie是否存在
        if (cookies != null) {
//            如果存在的操作
            out.write("上次访问的时间为:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie1 = cookies[i];
                if (cookie1.getName().equals("Last_LoginTime")) {
//                    获取Cookie中的值
                    long Last_LoginTime = Long.parseLong(cookie1.getValue());
                    Date date = new Date(Last_LoginTime);
                    out.write(date.toLocaleString());
                    System.out.println("上次访问的时间为:"+date.toLocaleString());
                }
            }
        } else {
//            不存在的操作
            out.write("这是您第一次访问本网站!");
        }

//        服务器给用户响应一个Cookie
        Cookie cookie2 = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
        cookie2.setMaxAge(24*60*60);
        resp.addCookie(cookie2);
    }

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

Xml:

<servlet>
    <servlet-name>Cookie1</servlet-name>
    <servlet-class>com.edwin.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Cookie1</servlet-name>
    <url-pattern>/Cookie1</url-pattern>
</servlet-mapping>

输出:

在这里插入图片描述

细节问题:

1.Cookie一般会保存在本地的用户目录下APPdata。

2.一个网站的Cookie是否存在上限?

  • 一个Cookie只能保存一个信息。

  • 一个Web站点可以给用户浏览器发送多个Cookie,最多存放20个。

  • Cookie大小有限制:最大4KB。

  • 300个Cookie是浏览器的上限。

删除Cookie:

1.不设置有效期,关闭浏览器后,会自动失效。

2.设置有效期为:0,效果同上。

代码:

Servlet:

package com.edwin.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 javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * @author Edwin D
 * @date 2020.6.6 上午 10:22
 */
//保存用户上次访问的时间
public class CookieDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
        cookie.setMaxAge(0);//清除代码。
        resp.addCookie(cookie);
    }

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

XML:

<servlet>
    <servlet-name>Cookie2</servlet-name>
    <servlet-class>com.edwin.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Cookie2</servlet-name>
    <url-pattern>/Cookie2</url-pattern>
</servlet-mapping>

操作前:

在这里插入图片描述

操作后:

在这里插入图片描述

编码,解码:

用于特殊情况下的乱码解决。

//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("Edwin 段","Utf-8");
//解码
out.write(URLEncoder.encode(cookie1.getValue(),"Utf-8");

参考文献

《【狂神说Java】JavaWeb入门到实战》

视频连接

2020.06.07

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章