1.Cookie、Session
1.1、会话
**会话:**用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。
**有状态会话:**一个同学来过教室,下次这个同学再来教室,我们会知道,这个同学曾经来过,称之为有状态会话。
你能怎么证明你是学生?
你 学校
- 学费发票 学校给你发票
- 学生登记 学校证明你来过了
一个网站,怎么证明宁你来过?
客户端 服务端
- 服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了
- 服务器登记你来过了,下次你来的时候我来匹配你
1.2、保存会话的两种技术
cookie:
- 客户端技术(响应、请求)
session:
- 服务器技术,利用这个技术可以保存用户的会话信息,我们可以把数据放在Session中!
常见场景:往回走那登录之后,你下次不用在登录了,第二次访问直接就上去了。
1.3、Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
package com.zhang.servlet;
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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器告诉你你来的时间,把这个时间封装成一个信件,你下次再来,我就知道你来了啊
//解决中文乱码
req.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
//Cookie,服务器端从客户端获取的
Cookie[] cookies = req.getCookies(); //这里返回数组,说明Cookie可以返回多个
//判断Cookie是否存在
if(cookies!=null){
//如果存在怎么办
out.write("last time:");
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("first come to here");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//cookie有效期为一天
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
resp.setCharacterEncoding("UTF-8");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
cookie:一般保存在本地的用户目录下appdata;
一个网站cookie是否存在上限!细节问题
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
- Cookie大小有限制4kb
- 300个cookie浏览器上限
删除Cookie:
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0
@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);
}
乱码:加这句
resp.setContentType("text/html;charset=UTF-8");
Cookie编码和解码:
//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("张三","UTF-8"));
//解码
out.write(URLDecoder.decode(cookie.getValue(),"UTF-8"