Cookie的使用
1.什么是Cookie
- Cookie是在浏览器访问Web服务器的某个资源时,由Web服务器在HTTP响应中附带传递给浏览器的一小段数据
- 一旦Web浏览器保存了某个Cookie,那么它以后每次访问该web服务器时,都应该在Http请求中将这个Cookie回传给Web服务器
- 一个Cookie主要由标识该信息的名称(name)和值(value)组成。
创建Cookie
@WebServlet("/cookie/save.do")
public class SaveCookie 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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//把用户输入的关键字保存到cookie
String data = req.getParameter("keyWords");
//创建Cookie
Cookie ck = new Cookie("key_"+System.currentTimeMillis(),data);
//设置属性
//设置有效时间
ck.setMaxAge(60*60*24*7);
//写给浏览器
resp.addCookie(ck);
resp.getWriter().println("save ok");
}
}
获取Cookie
//读取Cookie
@WebServlet("/cookie/read.do")
public class ReadCookie 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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//读取Cookie
Cookie[] cks = req.getCookies();
if ( cks!=null ){
resp.getWriter().println("<h1 > 我的搜索记录 </h1>");
resp.getWriter().println("<hr color='red'>");
for( Cookie ck : cks){
if(ck.getName().startsWith("key_")){
resp.getWriter().println("<p>"+ck.getValue()+"</p>");
}
}
}
}
}
移出Cookie
@WebServlet("/cookie/delete")
public class DeleteCookie 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 {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
Cookie[] cks = req.getCookies();
if(cks !=null){
for(Cookie ck:cks){
if(ck.getName().startsWith("key_")){
System.out.println("-----------");
// 设置时间,为0 立即过期
ck.setMaxAge(-1);
resp.addCookie(ck);
}
}
}
resp.getWriter().println("clear ok");
}
}
cookie的编码与解码
Cookie默认不支持中文,只能包含ASCLL字符,所以Cookie需要对Unicode字符进行编码,否则会出现乱码
- 编码可以使用java.net.URLEncoding类的encode(String str,String encoding)方法
- 解码使用java.net.URLDecoder类的
decode(String str ,String encoding)方法
创建带中文的Cookie
//使用中文的Cookie.name 与 value 都是用UTF-8编码
Cookie cookie = new Cookie9
URLEncoder.encode("姓名","UTF-8"),
URLEncoder.encode("老邢","UTF-8"));
//发送到客户端
respone.addCookie(cookie);
读取带中文的Cookie
if(request.getCookies() != null){
for(Cookie cc: request.getCookies()){
String cookieNmae = URLEncoder.decode(cc.getName(),"UTF-8");
String cookieNmae = URLEncoder.decode(cc.getValue(),"UTF-8");
}
}else{
out.println("Cookie以写入客户端,请刷新页面")
}
Cookie的优点和缺点
- 优点
- 可配置到期规则
- 简单性:Cookie是一种基于文本的轻量结构,包含简单的键值对。
- 数据持久性:Cookie默认在过期之前是可以一致存在客户端浏览器上的
- 缺点
- 大小受到限制:大多数浏览器对Cookie的大小有4K、8K字节的限制
- 用户配置为禁用:有些用户禁止了浏览器或客户端设备接受Cookie的能力,因此限制了这一功能
- 潜在的安全风险:Cookie可能会被篡改,会对安全性造成潜在风险或者导致依赖于Cookie的应用程序失败