文章目录
1.基本介绍
cookie的简单示意图
二说cookie
2.cookie常用方法
1.基本介绍
2.创建maven项目,导入servlet-api
3.创建cookie
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/createCookie")
public class CreateCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie,可以创建多个
Cookie cookie = new Cookie("sunxiansheng", "18");
resp.addCookie(cookie);
//设置编码
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("<h1>创建cookie成功</h1>");
//关闭
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp); //合二为一
}
}
4.读取cookie
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/readCookie")
public class ReadCookie 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) { //遍历cookie
System.out.println("name: " + cookie.getName() + " value: " + cookie.getValue());
}
}
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>cookie读取成功</h1>");
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.JSESSIONID
作用:用于区分不同的会话
6.读取指定cookie
1.ReadCookie.java
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/readCookie")
public class ReadCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
String name = "sun";
Cookie cookie = CookieUtils.readCookieByName(name, cookies);
if (cookie != null) {
System.out.println("name:" + cookie.getName() + " value:" + cookie.getValue());
}
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>cookie读取成功</h1>");
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
2.CookieUtils.java
package cookie;
import jdk.nashorn.internal.ir.annotations.Ignore;
import javax.servlet.http.Cookie;
/**
* @author 孙显圣
* @version 1.0
*/
public class CookieUtils {
public static Cookie readCookieByName(String name, Cookie[] cookies) {
//判断传进来的参数是否有问题
if (cookies == null || cookies.length == 0 || name == null || "".equals(name)) {
return null;
}
for (Cookie cookie : cookies) {
String name1 = cookie.getName(); //获取cookie的名字
if (name1.equals(name)) {
return cookie;
}
}
return null;
}
}
7.修改指定cookie
方式一:查找后修改
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/updateCookie")
public class UpdateCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = req.getCookies();
//要替换的cookie名字
String name = "sun";
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
//查找到cookie
Cookie cookie = CookieUtils.readCookieByName(name, cookies);
if (cookie != null) {
cookie.setValue("succeed!");
resp.addCookie(cookie); //将修改后的cookie添加到浏览器
//响应信息
writer.print("<h1>cookie修改成功</h1>");
}
else {
writer.print("<h1>cookie修改失败</h1>");
}
//关闭
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
方式二:添加同名cookie对象
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/updateCookie")
public class UpdateCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//要替换的cookie名字
String name = "sun";
//创建同名cookie对象,添加到浏览器
Cookie cookie = new Cookie(name, "hello");
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>cookie修改成功</h1>");
//关闭
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.cookie生命周期
1.基本介绍
2.指定秒数之后过期
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/cookieLive")
public class CookieLive extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie
Cookie cookie = new Cookie("lihua", "china");
//设置生命周期,超过生命周期之后,浏览器向服务器发送请求的时候就不会携带cookie,但是只要浏览器不关闭cookie就可能还在浏览器内
cookie.setMaxAge(60);
//将cookie添加到浏览器
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>设置cookie生命周期</h1>");
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
60秒内向服务器发送请求还会携带这个cookie
过了60秒之后再向服务器发送请求就不会携带这个cookie了,但是还是有可能仍然存放在浏览器的Application中
3.设置立即过期(相当于删除cookie)
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/cookieLive")
public class CookieLive extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取所有cookie
Cookie[] cookies = req.getCookies();
//查找到需要删除的cookie
Cookie cookie = CookieUtils.readCookieByName("sun", cookies);
//设置为立即过期,即删除
cookie.setMaxAge(0);
//将修改后的cookie发送到浏览器
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>cookie删除成功</h1>");
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4.不设置生命周期
不设置生命周期,则默认是cookie.setMaxAge(-1)
,就是会话级别,当浏览器关闭自动销毁
5.持久化存储
当生命周期设置的很长时,比如一年,即使浏览器关闭,cookie也是存储在浏览器的,每次浏览器向服务器发送请求时都会携带这个cookie
4.cookie有效路径
1.基本规则
2.应用实例
package cookie;
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 javax.xml.ws.spi.http.HttpContext;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/cookiePath")
public class CookiePath extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//演示有效路径的使用
Cookie cookie = new Cookie("sun", "path"); //不设置有效路径就默认是上下文路径/cookie_session
Cookie cookie1 = new Cookie("sun1", "path1");
cookie1.setPath("/cookie_session/path1"); //是给浏览器解析的,这里设置上下文路径加path1
Cookie cookie2 = new Cookie("sun2", "path1path2");
cookie2.setPath("/cookie_session/path1/path2"); //是给浏览器解析的,设置上下文路径加path1/path2
//添加到浏览器
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.addCookie(cookie2);
//显示信息
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>cookie有效路径设置成功</h1>");
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5.cookie课后练习
1.cookieLogin.java
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/cookieLogin")
public class cookieLogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
String res = ""; //初始的value为空字符串
//读取cookie,如果cookie中有username,则将这个username的值填充到界面,
//如果没有的话直接返回value为空的表单
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("username")){
res = cookie.getValue(); //将value设置成用户名再返回
}
}
//返回表单
writer.print("<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>Title</title>\n" +
"</head>\n" +
"<body>\n" +
"<h1>用户登录界面</h1>\n" +
"<form action=\"checkUser\" method=\"get\">\n" +
" 用户名:<input type=\"text\" value=\"" + res +
"\" name=\"username\"><br>\n" +
" 密码:<input type=\"password\" name=\"password\"><br>\n" +
" <input type=\"submit\" value=\"登录\">\n" +
"</form>\n" +
"</body>\n" +
"</html>");
}
}
2.checkUser.java
package cookie;
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;
import java.io.PrintWriter;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/checkUser")
public class checkUser extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
String username = req.getParameter("username");
//进行简单的校验
if (username.equals("sun")) { //如果登录成功,则设置cookie
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(1000000); //设置生命周期
resp.addCookie(cookie);
writer.print("<h1>登录成功</h1>");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.结果展示
6.cookie注意事项和细节
7.cookie中文乱码解决
1.cookieEncode.java(url编码)
package cookie;
import com.sun.org.apache.xpath.internal.operations.Variable;
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;
import java.io.PrintWriter;
import java.net.URLEncoder;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/cookieEncode")
public class cookieEncode extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建有中文的cookie
//将中文内容进行url编码,在读取的时候使用url解码
String value = URLEncoder.encode("孙显圣","utf-8");
Cookie cookie = new Cookie("name", value);
resp.addCookie(cookie);
resp.setContentType("text/html;charset=utf-8;");
PrintWriter writer = resp.getWriter();
writer.print("<h1>中文cookie设置成功</h1>");
//关闭
writer.flush();
writer.close();
}
}
2.cookieDecode.java(url解码)
package cookie;
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;
import java.net.URLDecoder;
/**
* @author 孙显圣
* @version 1.0
*/
@WebServlet(urlPatterns = "/cookieDecode")
public class cookieDecode extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("name")) {
//url解码
String decode = URLDecoder.decode(cookie.getValue(),"utf-8");
System.out.println(decode);
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
8.cookie小结(重点)
1.创建cookie
//创建cookie,可以创建多个
Cookie cookie = new Cookie("sunxiansheng", "18");
resp.addCookie(cookie);
注意:
cookie只要设置了就立即生效!!!
2.获取cookie数组
Cookie[] cookies = req.getCookies();
3.读取指定cookie
Cookie[] cookies = req.getCookies();
String name = "sun";
Cookie cookie = CookieUtils.readCookieByName(name, cookies);
if (cookie != null) {
System.out.println("name:" + cookie.getName() + " value:" + cookie.getValue());
}
4.修改指定cookie
方式一:查找后修改
//获取cookie
Cookie[] cookies = req.getCookies();
//要替换的cookie名字
String name = "sun";
//查找到cookie
Cookie cookie = CookieUtils.readCookieByName(name, cookies); //CookieUtils是自己写的工具类,用于查找到指定名字的cookie
if (cookie != null) {
cookie.setValue("succeed!");
resp.addCookie(cookie); //将修改后的cookie添加到浏览器
//响应信息
}
方式二:添加同名cookie对象覆盖原有value
//要替换的cookie名字
String name = "sun";
//创建同名cookie对象,添加到浏览器
Cookie cookie = new Cookie(name, "hello");
resp.addCookie(cookie);
5.JSESSIONID
区分不同会话,每次打开浏览器向服务器发送请求则开启一次会话,关闭浏览器则会话结束
6.cookie生命周期
7.cookie有效路径
只有包含有效路径的url请求才会携带这个cookie
//演示有效路径的使用
Cookie cookie = new Cookie("sun", "path"); //不设置有效路径就默认是上下文路径/cookie_session
Cookie cookie1 = new Cookie("sun1", "path1");
cookie1.setPath("/cookie_session/path1"); //是给浏览器解析的,这里设置上下文路径加path1
Cookie cookie2 = new Cookie("sun2", "path1path2");
cookie2.setPath("/cookie_session/path1/path2"); //是给浏览器解析的,设置上下文路径加path1/path2
//添加到浏览器
resp.addCookie(cookie);
resp.addCookie(cookie1);
resp.addCookie(cookie2);