Cookie
什么是cookie?
cookie(储存在用户本地终端上的数据)
Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
cookie的获取与响应
-
从请求中拿到cookie信息
-
服务器响应到客户端cookie
//cookie服务器端从客户端获取 Cookie[] cookies = req.getCookies(); //获得cookie的key cookie.getName(); //获得cookie的value cookie.getValue() //新建一个cookie Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+""); //设置cookie的有效期 cookie.setMaxAge(24*60*60); //响应给客户端一个cookie resp.addCookie(cookie);
cookie:一般保存在本地的用户目录下 appdata;
一个网站cookie是否存在上限?
- 一个cookie只能保存信息
- 一个web站点可以给浏览器发送多个cookie,上限一般为300个cookie
- cookie有大小限制,最大4kb
删除cookie的方法:
- 不设置有效期
- 关闭浏览器,自动失效
- 设置有效期时间为0
编码解码
URLDecoder.decode(cookie.getValue(),"UTF-8")
URLEncoder.encode("不仅","UTF-8")
从cookie中得到最近一次访问时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你,你来的时间,把这个时间封装成为一个信件,你下次带来,我就知道你来了
//解决中文乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("GBK");
PrintWriter out = resp.getWriter();
//cookie服务器端从客户端获取
Cookie[] cookies = req.getCookies(); //这里返回数组,说明Cookie可能存在多个(给你发校园卡,校服..。)
//判断cookie是否存在
if (cookies!=null){ //第一次访问一定为空
//如果存在该怎么进行操作
out.write("您上一次访问的时间是");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
//cookie.getValue();//这拿到的是一个字符串
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else{
out.write("这是您第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//设置cookie有效期为1天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
配置xml
<servlet>
<servlet-name>CookieDemo01</servlet-name>
<servlet-class>com.bu.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo01</servlet-name>
<url-pattern>/cookie1</url-pattern>
</servlet-mapping>
实验结果:
首次访问不会显示时间
刷新后会出现上次访问的时间
同时在cookie中会记录这次刷新的时间
删除cookie
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie,名字必须要和要删除的名字一致
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
//将cookie有效期设置为0,立马过期
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
配置xml
<servlet>
<servlet-name>CookieDemo02</servlet-name>
<servlet-class>com.bu.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo02</servlet-name>
<url-pattern>/cookie2</url-pattern>
</servlet-mapping>
访问cookie2后会删除cookie1中cookie的信息
解决中文数据怎么传递
public class CookieDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决请求响应的中文乱码
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("GBK");
//cookie服务器端从客户端获取
Cookie[] cookies = req.getCookies(); //这里返回数组,说明Cookie可能存在多个(给你发校园卡,校服..。)
PrintWriter out = resp.getWriter();
if (cookies!=null){ //第一次访问一定为空
//如果存在该怎么进行操作
out.write("您上一次访问的时间是");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("name")){
//获取cookie中的值
//解码
out.write(URLDecoder.decode(cookie.getValue(),"UTF-8"));
}
}
}else{
out.write("这是您第一次访问本站");
}
//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("不仅","UTF-8"));
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
配置xml
<servlet>
<servlet-name>CookieDemo03</servlet-name>
<servlet-class>com.bu.servlet.CookieDemo03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo03</servlet-name>
<url-pattern>/cookie3</url-pattern>
</servlet-mapping>
主要的应用就是下面的两行代码
URLDecoder.decode(cookie.getValue(),"UTF-8")
URLEncoder.encode("不仅","UTF-8")