目录
摘要
http协议是一个无状态的协议,你每一个跳转到下一个页面的时候都是需要先登录才能使用,这样就很麻烦比如淘宝,没有cookie和session的话,用户在首页已经登录上去了,但是需要再次登录才能选择商品,需要再次登录才能放到购物车,需要再次登录才能然后购买,这样用户的体验是相当差的。
一、Cookie是什么?
(1)cookie是再浏览器中保存的。
(2)如果想要使用cookie要保证我们的浏览器是否开启cookie,之所以说有一定的弊端,如果浏览器没有开启cookie,就不能在使用cookie了。
(3)cookie的大小是有限制的,通常是4096byte。
(4)cookie的保存是以键值对的形式存在的。
二、Cookie的常用方法
//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String name,String value)
//2.设置cookie的方法
setValue(String value) //修改cookie的值
setMaxAge(int time) //设置cookie的有效时间
setPath(String path) //设置当前cookie的有效路径
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获取浏览器中cookie,返回值是一个数组
Cookie[] cookies = request.getCookies();
三、代码案例
- 第一个servlet将数据“sb” 存到cookie 里,起个名字交msg,并设置这条cookie的生效时间 ;第二个servlet分别将key 值 和value值取出来,第三个servlet清空这条cookie
(1)第一个servlet
package com.by.servlet2;
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 SetCookieServlet 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 {
// 1. 获取Cookie,并将sb存到cookie里
Cookie cookie = new Cookie("msg", "sb");
/**
* 2.设置有效时间
* 正数:表示当前cookie的有效时间
* 负数:表示当前浏览器打开的时候存在,关闭的时候没了
* 0:销毁当前的cookie
*/
cookie.setMaxAge(6000);
// 3. 把Cookie发送到浏览器
resp.addCookie(cookie);
}
}
(2)第二个servlet
/*
* Copyright (c) 2020, 2023, webrx.cn All rights reserved.
*
*/
package com.by.servlet2;
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 GetCookieServlet 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 {
// 1. 获取所有Cookie,返回一个数组
Cookie[] cookiesArr = req.getCookies();
// 2. 遍历所有Cookie
for (Cookie cookie : cookiesArr) {
System.out.println("=====================");
// 3. 获取键
String name = cookie.getName();
System.out.println(name);
// 4. 获取值
String value = cookie.getValue();
System.out.println(value);
}
}
}
(3)第三个servlet
/*
* Copyright (c) 2020, 2023, webrx.cn All rights reserved.
*
*/
package com.by.servlet2;
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 DestroyCookieServlet 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 {
/**
* 清空指定的cookie :本质是将cookie的生效时间变成0
*/
//1. 获取所有Cookie
Cookie[] cookies = req.getCookies();
// 2. 遍历cookie数组
for (Cookie cookie : cookies) {
// 3. 找到要删除的cookie,根据key值找指定cookie
if(cookie.getName().equals("msg")){
// 4. 将这个查找出来的cookie的生效时间设置为0
cookie.setMaxAge(0);
// 5. 将修改后的cookie重新发送给浏览器
resp.addCookie(cookie);
}
}
}
}
(4) web.xml 配置
<!--Cookie-->
<servlet>
<servlet-name>setCookieServlet</servlet-name>
<servlet-class>com.by.servlet2.SetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setCookieServlet</servlet-name>
<url-pattern>/setCookieServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>GetCookieServlet</servlet-name>
<servlet-class>com.by.servlet2.GetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetCookieServlet</servlet-name>
<url-pattern>/GetCookieServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DestroyCookieServlet</servlet-name>
<servlet-class>com.by.servlet2.DestroyCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DestroyCookieServlet</servlet-name>
<url-pattern>/DestroyCookieServlet</url-pattern>
</servlet-mapping>
四、运行结果
首先运行第一个servlet 将数据存到cookie里,接着运行第二个servlet 获取key 和 value
然后运行第三个servlet ,清空cookie后 再重新运行第二个servlet