JavaWeb学习打卡11(cookie(甜点)详解)
Session(会话)
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
有状态会话:一个学生来过教室,下次再来教室,我们会知道这个同学,曽经来过,称之为有状态的会话。
一个网站怎么证明你来过?
客户端 服务端
- 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了; cookie
- 服务器登记你来过了,下次你来的时候我来匹配你; seesion
保存会话的两种技术
cookie
- 客户端技术 (响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或数据放在Session中
常见场景:网站登录之后,你下次不用再登录了,第二次访问直接就登录了
Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
cookie常用的方法:
Cookie[] cookies = req.getCookies(); //获得cookie cookie.getName(); //获得cookie中的key cookie.getValue(); //获得cookie中的vlaue new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie cookie.setMaxAge(24*60*60); //设置cookie有效期为24小时 resp.addCookie(cookie);//将cookie 响应回客户端
cookie 常用方法的使用:
package com.xu.cookie;import javax.servlet.ServletException; 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.io.PrintWriter; import java.util.Date;public class CookieDemo01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//服务器告诉你,你来的时间,把这个时间封装成为也给信件 , 你下次带来,我就知道你来了//先解决中文乱码问题req.setCharacterEncoding("utf-8");// 如果写 resp.setCharacterEncoding("utf-8");还是显示乱码,就将resp 代码改为:resp.setContentType("text/html;charset=utf-8");resp.setContentType("text/html;charset=utf-8");//设置浏览器的响应格式为:html ,编码为:utf-8//创建一个输出流对象PrintWriter out = resp.getWriter();//Cookie,是服务端从客户端获取的Cookie[] cookies = req.getCookies();//这里是返回数组,说明Cookie可能存在多个//判断Cookie 是否存在if(cookies!= null){ //判断Cookie 不为空, 则不是第一次访问//cookie 存在out.write("你上次访问的时间是:");for (int i = 0; i < cookies.length; i++) {Cookie cookie = cookies[i];//获取cookie 的名字if (cookie.getName().equals("lastLoginTime")){//获取cookie 中的值long lastLoginTime = Long.parseLong(cookie.getValue());Date date = new Date(lastLoginTime);out.write(date.toLocaleString());}}}else {out.write("这是您第一次访问本站");}//服务端给客户端响应(发送)一个cookie//先new一个cookie ,name为:lastLoginTime ;value为:最后一次访问的时间戳Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");//设置cookie有效期为一天cookie.setMaxAge(24*60*60);resp.addCookie(cookie);//将cookie 响应回客户端}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }
web.xml 文件注册servlet :
<servlet><servlet-name>CookieDemo01</servlet-name><servlet-class>com.xu.cookie.CookieDemo01</servlet-class></servlet><servlet-mapping><servlet-name>CookieDemo01</servlet-name><url-pattern>/c1</url-pattern></servlet-mapping>
运行结果:
cookie:一般会保存到本地的 用户目录下 appdata
一个网站cookie 是否存在上限!
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,
- cookie大小限制:4kb
- 浏览器的上限:300个cookie
删除Cookie:
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效期时间为 0 ;
删除Cookie代码实现:
package com.xu.cookie;import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class CookieDemo02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建一个cookie , 名字必须要和要删除的名字一致Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");//将cookie有效期设置为 0 ,立马过期cookie.setMaxAge(0);//将cookie响应回客户端resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }
在web.xml 文件中配置servlet:
<!-- 配置CookieDemo02--><servlet><servlet-name>CookieDemo02</servlet-name><servlet-class>com.xu.cookie.CookieDemo02</servlet-class></servlet><servlet-mapping><servlet-name>CookieDemo02</servlet-name><url-pattern>/c2</url-pattern></servlet-mapping>
运行结果:
解决中文乱码问题:
//编码中文URLEncoder.encode("小许","utf-8");//解码中文URLDecoder.decode(cookie.getValue(),"utf-8");