Cookie 客户端会话技术
会话技术
1.会话:
一次会话中包括多次请求和响应
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2.功能:
在一次会话的范围内的多次请求简,共享数据
3.方式:
1.客户端会话技术:Cookie
2.服务器端会话技术:Session
Cookie
1.概念:
客户端会话技术,将数据保存到客户端
2.实现原理
基于响应头set-cookie和请求头cookie实现
3.设置cookie
void setPath(java.lang.String uri) :设置cookie的有效访问路径
void setMaxAge(int expiry) :设置cookie的有效时间
void setValue(java.lang.String newValue) :设置cookie的值
4.服务器接收cookie,拿到数据
Cookie[] request.getCookies();
新建Cookie,获取Cookie:
5.Cookie中的细节
1.void setPath(java.lang.String uri):设置cookie的有效访问路径
有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
2.void setMaxAge(int expiry):设置cookie的有效时间
正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间,单位秒。
负整数:表示cookie数据保存在浏览器的内存中,浏览器关闭cookie就丢失了。
零:表示删除同名的cookie数据
3.可以保存多个cookie,但是浏览器一般只允许存放300个站点,每个站点最多存放20个cookie,每个cookie的大小限制为4KB。
4.在Tomcat 8 之前 cookie中不能直接存储中文数据
在Tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议时间URL编码存储,URL解码解析,URLEncoder.encode(String value,"utf-8")
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("/cookiedome1") public class CookieDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建cookie对象 Cookie cookie = new Cookie("password", "10086"); //设置Cookie有效期 cookie.setMaxAge(10); //单位 秒 //设置访问路径 cookie.setPath("/qwer"); //设置Cookie中的值 cookie.setValue("10010"); //将cookie保存到浏览器 resp.addCookie(cookie); //获取Cookies Cookie[] cookies = req.getCookies(); if(cookies != null){ //如果没有Cookie,则输出提示 //不为空,遍历Cookie for (Cookie c : cookies){ String name = c.getName(); String value = c.getValue(); System.out.println(name + " :" + value); } }else { System.out.println("没有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.text.SimpleDateFormat; import java.util.Date; @WebServlet("/cookiedemo2") public class CookieDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); //格式化日期 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss"); //获取当前日期 String format = simpleDateFormat.format(new Date()); //声明变量 String lastTime = null; //获取所有cookie Cookie[] cookies = req.getCookies(); //第n次访问 if(cookies != null){ for (Cookie c : cookies){ if ("time".equals(c.getName())){ //把时间赋给上次访问时间 lastTime = c.getValue(); //输出信息 resp.getWriter().write("上次访问时间" + lastTime + "本次访问时间" + format); //更新上次访问时间 c.setValue(format); c.setMaxAge(3600 * 24 * 365); //添加到浏览器 resp.addCookie(c); } } } //第一次访问 if(cookies == null || lastTime == null){ resp.getWriter().write("您是首次访问该网站,时间:" + format); //把时间保存在cookie中 Cookie cookie = new Cookie("time", format); //设置Cookie保存时间 cookie.setMaxAge(3600 * 24 * 365); //以秒为单位 //添加到浏览器中 resp.addCookie(cookie); } } }

浙公网安备 33010602011771号