文章目录
1.什么是Cookie
1)Cookie翻译过来是饼干的意思
2)Cookie是服务器通知客户端保存键值对的一种技术
3)客户端有了Cookie后,每次请求都发送给服务器
4)每个Cookie的大小不超过4kb
2.如何创建Cookie
我们创建一个包,假设命名为com.bjpowernode,在这个包下,创建两个文件,一个BaseServlet.java,一个CookieServlet.java
package com.bjpowernode;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
//解决post请求中文乱码问题
//一定要在获取请求参数之前调用才有效
request.setCharacterEncoding("UTF-8");
//解决响应中文乱码问题
response.setContentType("text/html;charset=UTF-8");
String action=request.getParameter("action");
try{
//获取action业务鉴别字符串,获取相应的业务,方法反射对象
Method method=this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
//调用目标业务,方法
method.invoke(this,request,response);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//解决post请求中文乱码问题
//一定要在获取请求参数之前调用才有效
request.setCharacterEncoding("UTF-8");
//解决响应中文乱码问题
response.setContentType("text/html;charset=UTF-8");
String action=request.getParameter("action");
try{
//获取action业务鉴别字符串,获取相应的业务,方法反射对象
Method method=this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
//调用目标业务,方法
method.invoke(this,request,response);
}catch(Exception e){
e.printStackTrace();
}
}
}
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieServlet extends BaseServlet{
protected void createCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
System.out.println("cookie创建成功");
//1.创建Cookie对象
Cookie cookie=new Cookie("key1","value1");
//2.通知客户端保存Cookie
response.addCookie(cookie);
response.getWriter().write("Cookie创建成功");
System.out.println("cookie创建成功");
}
}
配置web.xml,然后创建一个cookie.html,代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="pragma" content=""no-cache>
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta charset="UTF-8">
<title>Cookie</title>
<base href="http://localhost:8080/Maven7/">
<style type="text/css">
ul li{
list-style:none;
}
</style>
</head>
<body>
<iframe name="target" width="400" height="400" style="..."></iframe>
<div style="...">
<ul>
<li><a href="cookieServlet?action=createCookie" target="target" method="post">Cookie的创建</a></li>
<li><a href="" target="target">Cookie的获取</a></li>
<li><a href="" target="target">Cookie值的修改</a></li>
<li>Cookie的存活周期</li>
<li>
<ul>
<li><a href="" target="target">Cookie的默认存活时间(会话)</a></li>
<li><a href="" target="target">Cookie立即删除</a></li>
<li><a href="" target="target">Cookie存活3600秒(1小时)</a></li>
</ul>
</li>
<li><a href="" target="target">Cookie的路径设置</a></li>
<li><a href="" target="target">Cookie的用户登录联系</a></li>
</ul>
</div>
</body>
</html>
运行Tomcat,进入cookie.html页面,然后打开调试器,进入应用程序选项
点击Cookie的创建
结果如下:
点击网络,如图
点击cookieServlet?action=createCookie,点击标头
看到set-cookie:key1=value1,一开始客户端没有Cookie,然后客户端向服务器请求,那么服务器先创建Cookie对象,然后通知客户端保存Cookie,然后通过响应头set-Cookie通知客户端保存Cookie,浏览器收到响应后,发现有set-cookie响应头,就去查看有没有这个cookie,没有就创建一个cookie,有就修改
3.服务器获取Cookie
服务器获取客户端的Cookie只需要一行代码:
request.getCookies():Cookie[]
我们创建修改Cookie.Servlet,代码如下:
public class CookieServlet extends BaseServlet{
//创建Cookie
protected void createCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
System.out.println("cookie创建成功");
//1.创建Cookie对象
Cookie cookie=new Cookie("key1","value1");
//2.通知客户端保存Cookie
response.addCookie(cookie);
response.getWriter().write("Cookie创建成功");
System.out.println("cookie创建成功");
}
//获取Cookie
protected void getCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
System.out.println("cookie的获取");
Cookie[]cookies=request.getCookies();
for(Cookie cookie:cookies){
//getName方法返回Cookie的key(名)
//getValue方法返回Cookie的value值
response.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]<br>");
}
}
}
修改cookie.html
<li><a href="cookieServlet?action=createCookie" target="target" method="post">Cookie的创建</a></li>
<li><a href="cookieServlet?action=getCookie" target="target" method="post">Cookie的获取</a></li>
结果如下:
打开网络,查看如下:
客户端有Cookie:key1=value1,通过请求头,Cookie把cookie信息发送给服务器,服务器获取客户端发送过来的Cookie.
我们没有方法通过key值直接获取想要的Cookie,故只能通过遍历来获取
protected void getCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
System.out.println("cookie的获取");
//获取所有Cookie
Cookie[]cookies=request.getCookies();
Cookie iwantCookie=null;
for(Cookie cookie:cookies) {
//getName方法返回Cookie的key(名)
//getValue方法返回Cookie的value值
//response.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br>");
if("key1".equals(cookie.getName())){
iwantCookie=cookie;
break;
}
}
//如果不等于null,说明找到了需要的cookie
if(iwantCookie!=null){
response.getWriter().write("找到了需要的Cookie");
}
}
结果如下:
因为这个查找Cookie经常要用到,所有我们把它弄到一个工具类中,我们创建一个包,假设命名为com.util,在这个包下创建一个CookieUtils.java类,代码如下:
package com.util;
import javax.servlet.http.Cookie;
public class CookieUtils {
/**
* 查找指定名称的Cookie对象
* @param name
* @param cookies
* @return
*/
public static Cookie findCookie(String name,Cookie[]cookies){
if(name==null||cookies==null||cookies.length==0)
return null;
for(Cookie cookie:cookies){
if(name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
修改CookieServlet.java代码
//获取Cookie
protected void getCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
System.out.println("cookie的获取");
//获取所有Cookie
Cookie[]cookies=request.getCookies();
Cookie iwantCookie= CookieUtils.findCookie("key1",cookies);
//如果不等于null,说明找到了需要的cookie
if(iwantCookie!=null){
response.getWriter().write("找到了需要的Cookie");
}
}
4.Cookie值的修改
方案一:
1.创建一个要修改的同名的Cookie对象
2.在构造器中,同时赋予新的Cookie值
3.调用response.addCookie(Cookie);
我们在CookieServlet.java中添加方法
//修改Cookie
protected void updateCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//方案一:
//1.创建一个要修改的同名的Cookie对象
Cookie cookie=new Cookie("key1","newValue1");
//2.在构造器中,同时赋予新的Cookie值
response.addCookie(cookie);
//3.调用response.addCookie(Cookie);
response.getWriter().write("key1已经修改");
}
配置cookie.html,然后运行Tomcat,结果如下
方案二:
1.先查找到需要修改的Cookie对象
2.调用setValue方法赋予新的Cookie值
3.调用resopnse.addCookie()通知客户端保存修改
我们修改updateCookie方法
protected void updateCookie(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//方案一:
//1.创建一个要修改的同名的Cookie对象
//Cookie cookie=new Cookie("key1","newValue1");
//2.在构造器中,同时赋予新的Cookie值
//response.addCookie(cookie);
//3.调用response.addCookie(Cookie);
//response.getWriter().write("key1已经修改");
//方案二:
//1.先查找到需要修改的Cookie对象
Cookie cookie=CookieUtils.findCookie("key1", request.getCookies());
if(cookie!=null) {
//2.调用setValue方法赋予新的Cookie值
cookie.setValue("newValue11");
//3.调用resopnse.addCookie()通知客户端保存修改
response.addCookie(cookie);
}
response.getWriter().write("key1已经修改");
}
结果如下:
5.Cookie的生命控制
Cookie的生命控制指的是如何管理Cookie什么时候被销毁
setMaxAge(int)
正数:表示在指定的秒数后过期
负数:表示浏览器一关,Cookie就会被删除(默认值是-1)
零:表示马上删除Cookie
我们在CookieServlet.java添加defaultLife方法
//默认生命周期
protected void defaultLife(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
Cookie cookie=new Cookie("defaultLife","defaultLife");
cookie.setMaxAge(-1);//设置存活时间
response.addCookie(cookie);
}
修改cookie.html,运行Tomcat
我们关闭浏览器,在重新打开,结果如下:
我们在CookieServlet.java中添加deleteNow方法,代码如下
//马上删除
protected void deleteNow(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
//先找到要删除的Cookie对象
Cookie cookie=CookieUtils.findCookie("key1",request.getCookies());
if(cookie!=null){
//调用setMaxAge(0);
cookie.setMaxAge(0);
//调用response.addCookie(cookie)
response.addCookie(cookie);
response.getWriter().write("key1的Cookie已经被删除");
}
}
修改cookie.html,先点击创建Cookie,
再点击Cookie立即删除
我们在CookieServlet.java添加life3600方法,代码如下:
//存活1小时
protected void life3600(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
Cookie cookie=new Cookie("life3600","life3600");
cookie.setMaxAge(60*60);//设置Cookie一小时后被删除,无效
response.addCookie(cookie);
response.getWriter().write("已经创建一个存活一小时的Cookie");
}
修改cookie.html,运行Tomcat,结果如下:
这个Cookie在一小时后被删除,关闭浏览器也不会删除
6.Cookie有效路径path的设置
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器,哪些不能,path属性是通过请求的地址来进行有效的过滤,如:
CookieA path=/工程路径
CookieB path=/工程路径/abc
请求地址如下:
http://ip:port/工程路径/a.html
CookieA发送
CookieB不发生
http://ip:port/工程路径/abc/a.html
CookieA发送
CookieB发送
我们在CookieServlet.java添加testPath方法,代码如下:
//设置路径path
protected void testPath(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
Cookie cookie=new Cookie("path1","path1");
//getContextPath()==>>得到工程路径
cookie.setPath(request.getContextPath()+"/abc");//==>>/工程路径/abc
response.addCookie(cookie);
response.getWriter().write("创建了一个带有路径的Cookie");
}
修改cookie.html,运行Tomcat,结果如下:
我们没发现我们工程所创建的path1,我们打开网络,点击cookieServlet?action=testPath,看见set-cookie:path1=path1;Path=/Maven7/abc,说明刚才确实有创建path1
而我们浏览器的地址栏中是:
http://localhost:8080/Maven7/cookie.html
我们在地址栏中输入:
http://localhost:8080/Maven7/abc/cookie.html
结果如下:
此时看得到path1
7.Cookie练习–免输入用户名登录
第一次登录时,将用户名保存为Cookie发送给服务器,第二次登录时无需输入,会把Cookie发送个服务器,从而实现免密登录
我们创建一个LoginServlet.java,代码如下:
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
String username=request.getParameter("username");
String password=request.getParameter("password");
//比较用户名和密码是否正确,这里不连接数据库了,为了方便演示,直接写出固定的
if("cxy".equals(username)&&"123456".equals(password)){
//登录成功
Cookie cookie=new Cookie("username",username);
cookie.setMaxAge(60*60*24);//当前Cookie一天内有效
response.addCookie(cookie);
System.out.println("登录成功");
}else{
//登录失败
System.out.println("登录失败");
}
}
}
创建一个login.jsp,代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="http://localhost:8080/Maven7/loginServlet" method="get">
用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
修改web.xml配置,然后运行Tomcat
我们先输入错误的密码
关闭浏览器在重新打开,此时不显示用户名
我们输入正确的用户名和密码,关闭后重新打开,此时显示用户名:
同理可以设置免密码输入