Cookie讲解
会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程称为会话。
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过称为有状态会话
服务端怎么证明客户端来过
- 服务端给客户端一个信件,服务器下次访问的时候带上信件就可以了。cookie
- 服务器登记你来过,下次来的时候我匹配你。session
保存会话的两种技术
cookie
客户端技术(响应,请求)
session
服务器技术,利用这个技术可以保留用户的会话信息,我们可以把信息或者数据放在session中
常见场景:
网络登录之后,第二次访问直接就可以进去
cookie

一般会保存在本地的用户目录下appdata
- 从请求中拿到cookie信息
2。 服务器响应到客户端
package com.xin.servlet;
import javafx.scene.chart.PieChart;
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 javax.xml.crypto.Data;
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-16");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
//cookie,服务端从客户端获取,从请求里拿到cookie.
Cookie[] cookies = req.getCookies();//获得cookie。这里返回数组,说明cookie可能存在多个
//判断cookie是否存在
if(cookies!=null){
//如果存在
out.write("你上一次访问的时间是:");
for(int i=0;i<cookies.length;i++){
Cookie cookie = cookies[i];
//获取cookie的名字,getName(),获得cookie中的key
if ( cookie.getName().equals("LastLoginTime")){
//获取cookie的值,并转化成长整型.long是包装类的
//把字符串变成时间
//有key就有value
long LastLoginTime = Long.parseLong(cookie.getValue());
//把时间变成字符串,new一个对象
Date date = new Date(LastLoginTime);
//用out写出去
out.write(date.toLocaleString());
}
}
}else {
//基本不会出,因为浏览器的cookie不会为null,容器依然存在
out.write("这是您第一次访问本站");
}
//服务器给客户端响应cookie,新建一个cookie
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
//cookie有效期为一天,以秒为单位
//expire:有效期
cookie.setMaxAge(24*60*60);
//响应给客户端,也可以响应多个
resp.addCookie(cookie );
}
**一个网站的cookie是否存在上限?
- 一个cookie只能保存一个信息
- 一个web网站可以给浏览器可以发送多个cookie,最多可以存放20个cookie
- cookie大小有限制40kb
- 300个cookie浏览器上限
删除cookie
- 不设置有效期,关闭浏览器,自动失效
- 设置有效期时间为0.比如新建demo02。启动就类似清除了cookie,重新启动的时候没有上一次的访问时间
//创建一个cookie,名字要和要删除的名字一致
Cookie cookie new Cookie("lastlogintime",System.currentTimeMillis()+"");
cookie.setMaxAge(0);
resp.addCookie(cookie);
中文数据传递
package com.xin.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.net.URLDecoder;
import java.net.URLEncoder;
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-16");
resp.setContentType("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies();
PrintWriter out = resp.getWriter();
resp.getWriter();
if (cookies!=null){
out.write("你上一次访问的时间");
for (int i= 0;i<cookies.length;i++){
Cookie cookie = cookies[i];
if (cookie.getName().equals("name")){
System.out.println(cookie.getValue());
URLDecoder.decode(cookie.getValue(),"UTF-8");
out.write(cookie.getValue());
}
}
}
else {
out.write("第一次访问");
}
// Cookie cookie = new Cookie("name","熙熙");
Cookie cookie = new Cookie("name", URLEncoder.encode("熙熙","utf-8"));
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
以下方法:
//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("熙熙","utf-8"));
//解码
URLDecoder.decode(cookie.getValue(),"UTF-8");
out.write(cookie.getValue());
还有一种就是把 响应和请求的编码设置改成:utf-16
控制台输出乱码
给tomcat的vm配置中输入
-Dfile.encoding=UTF-8


浙公网安备 33010602011771号