先了解Cookie
Cookie是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于Cookie 是服务器端保存在客户端的信息,所以其安全性也是很差的。例如常见的记住密码则可以通过Cookie来实现。
有一个专门操作Cookie的类javax.servlet.http.Cookie。随着服务器端的响应发送给客户端,保存在浏览器。当下次再访问服务器时把Cookie再带回服务器。
Cookie的格式:键值对用“="链接,多个键值对间通过";“隔开。
Cookie的创建以及响应
//Cookie的创建
Cookie cookie = new Cookie("uname","zhangsan");
//Cookie的响应
response.addCookie(cookie);
由于Cookie没有提供无参构造,所以只能通过实例化Cookie对象直接把值传进去,传进去还需要将其发送出去(Cookie的相应).
Cookie的遍历 它的缺点就是不能获取单个Cookie(一下全部就获取所有的Cookie,想要你需要的Cookie还需要进行简单的判断)
//获取cookie数组
Cookie[] cookies = request.getCookies();//获取Cookie数组
if (cookies!=null && cookies.length>0){//非空判断
for (Cookie cookie : cookies) {
System.out.println(cookie.getName()+":"+cookie.getValue());
}
}
Cookie的生命周期(到期时间)
1.到期时间:负整数(默认值-1.表示只在浏览器内存中存活,关闭浏览器失效)
2.到期时间:正整数(表示存活指定秒数,会将数据存在磁盘中)
3.到期时间:零(表示删除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;
@WebServlet("/c03")
public class cookie03 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*到期时间:负整数(默认值-1.表示只在浏览器内存中存活,关闭浏览器失效)*/
Cookie cookie1 = new Cookie("uname1","lisi");
cookie1.setMaxAge(-1);
response.addCookie(cookie1);
/*到期时间:正整数(表示存活指定秒数,会将数据存在磁盘中)*/
Cookie cookie2 = new Cookie("uname2","wangwu");
cookie2.setMaxAge(30);
response.addCookie(cookie2);
/*到期时间:零(表示删除cookie)*/
Cookie cookie3 = new Cookie("uname3","zhaoliu");
cookie3.setMaxAge(0);
response.addCookie(cookie3);
}
}
Cookie的注意点
1.Cookie只在当前浏览器有效(不跨浏览器和电脑)
2.Cookie不能存中文
如果一定要存中文,则需要通过URLEncoder.encode()方法进行编码,获取时通过URLDecoder.decode()方法进行解码
3.如果出现同名的Cookie对象,则会覆盖
4.Cookie的存储数量是有上限的,不同浏览器的上限不同。Cookie存储的大小是有限的,在4kb左右。
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;
@WebServlet("/c04")
public class cookie04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Cookie存中文
String name = "姓名";
String value = "张三";
Cookie cookie = new Cookie(name,value);
response.addCookie(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;
import java.net.URLEncoder;
@WebServlet("/c04")
public class cookie04 extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Cookie存中文
String name = "姓名";
String value = "张三";
//将中文通过URLEncoder进行编码
name = URLEncoder.encode(name);
value = URLEncoder.encode(value);
//创建Cookie
Cookie cookie = new Cookie(name,value);
response.addCookie(cookie);
//获取Cookie时通过URLDecoder解码
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
for (Cookie cook : cookies) {
//解码
System.out.println(URLDecoder.decode(cook.getName()));
System.out.println(URLDecoder.decode(cook.getValue()));
}
}
}
}
结果如下:
没有报错,但是我们的中文会以图的方式存储起来。
看看此时的控制台,会发现中文可以输出,说明我们 如果一定要存中文,则需要通过URLEncoder.encode()方法进行编码,获取时通过URLDecoder.decode()方法进行解码。
Cookie的路径