1.概念 客户端会话技术,将数据保存到客户端
2.使用步骤
//1.创建Cookie对象,并绑定值 Cookie cookie = new Cookie("lastTime",str_date); //2.设置cookie的存活时间(Cookie默认在浏览器关闭时销毁) cookie.setMaxAge(60 * 60 * 24 * 30); //3.发送Cookie response.addCookie(cookie); //4.获取所有Coolie Cookie[] cookies = request.getCookies();3.实现原理 基于响应头set-cookie和请求头cookie实现 4.Cookie拓展 (1)一次可以发送多个cookie.
(2)cookie在浏览器中保存多长时间? 默认情况下,当浏览器关闭后,Cookie数据被销毁 但是,可以通过 setMaxAge(int seconds) 方法给cookie设置存活时间让它不销毁
1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效 2. 负数:默认值 3. 零:删除cookie信息(3) cookie能不能存中文?通过URL编码解决cookie值含空格的问题 在tomcat 8 之后,cookie支持中文数据。特殊字符(比如空格)还是不支持,建议使用URL编码存储,URL解码解析
//URL编码 cookie.setValue(URLEncoder.encode(str_date,"utf-8")); //响应数据,解码 String value = cookie.getValue(); value = URLDecoder.decode(value,"utf-8");(4)cookie共享 一个服务器不同项目中共享cookie
默认情况下cookie不能共享 通过 setPath(String path) 方法设置cookie的获取范围。默认情况下,设置当前的虚拟目录 如果要共享,则可以将path设置为"/"不同服务器共享cookie
同样,默认情况下cookie不能共享 但是通过设置一级域名相同,那么多个服务器之间cookie可以共享 setDomain(".baidu.com"); 那么tieba.baidu.com和news.baidu.com中cookie可以共享5.Cookie的特点 cookie存储数据在客户端浏览器 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
6.Cookie的作用 cookie一般用于存出少量的不太敏感的数据 在不登录的情况下,完成服务器对客户端的身份识别
7.经典案例:通过Cookie第一次访问一个页面提示第一次登陆,之后每次访问提示上一次登陆时间
package com.beizhen.servlet; 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; import java.text.SimpleDateFormat; import java.util.Date; /** * 判断是否第一次访问 * @author : Bei-Zhen * @date : 2020-10-08 14:09 */ @WebServlet("/check") public class CookieServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置请求和响应的编码格式 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //1.获取所有Coolie Cookie[] cookies = request.getCookies(); System.out.println(cookies.length); //默认没有cookie boolean flag = false; //2.遍历cookie数组 if(cookies != null && cookies.length > 0){ for (Cookie cookie : cookies) { System.out.println(cookie.getName() + ":" +cookie.getValue()); //3.获取cookie的名称 String name = cookie.getName(); //4.判断名称是否为lastTime if("lastTime".equals(name)){ //存在该Cookie,不是第一次访问 flag = true; //设置cookie的value Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); //URL编码 cookie.setValue(URLEncoder.encode(str_date,"utf-8")); //设置cookie的存活时间 cookie.setMaxAge(60 * 60 * 24 * 30); response.addCookie(cookie); //响应数据,解码 String value = cookie.getValue(); value = URLDecoder.decode(value,"utf-8"); response.getWriter().write("<h1>欢迎回来,你上次登录时间为:" + value + "</h1>"); } } } if(cookies == null || cookies.length == 0 || flag == false){ //第一次访问,设置Cookie的值 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); Cookie cookie = new Cookie("lastTime",str_date); //URL编码 cookie.setValue(URLEncoder.encode(str_date,"utf-8")); //设置cookie的存活时间 cookie.setMaxAge(60 * 60 * 24 * 30); response.addCookie(cookie); response.getWriter().write("<h1>你好,欢迎你首次登录</h1>"); response.sendRedirect("/login.jsp"); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }1.概念 服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中
2.使用步骤
1. 获取HttpSession对象: HttpSession session = request.getSession(); 2. 使用HttpSession对象: Object getAttribute(String name) //获得 void setAttribute(String name, Object value) //设值 void removeAttribute(String name) //删除3.实现原理 Session的实现是依赖于Cookie的
4.Session拓展 (1)当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下不是。 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。 Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c);(2)客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作 session的钝化: 在服务器正常关闭之前,将session对象系列化到硬盘上 session的活化: 在服务器启动后,将session文件转化为内存中的session对象即可。(3)session什么时候被销毁?
1. 服务器关闭 2. session对象调用invalidate() 。 3. session默认失效时间 30分钟 选择性配置修改 <session-config> <session-timeout>30</session-timeout> </session-config>5.Session的特点 session用于存储一次会话的多次请求的数据,存在服务器端 session可以存储任意类型,任意大小的数据
