会话技术Cookie
实现原理
用售卖网站举例,当浏览器第一次发送请求,携带一个请求参数X(这里比作想要购买的东西),这个参数发送到服务器中,在响应过程中,以set-cookie响应头的形式响应到浏览器,再把set-cookie响应头对应的值存储在浏览器中(相当于把自己喜欢的商品添加到购物车),请求会自动携带一个cookie请求头。请求头中数据就是刚刚存在浏览器中cookie信息。
特点
浏览器端技术,数据信息存储在浏览器中,安全性较低,擅长长会见存储数据。
代码实现
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
//实现获取上次访问页面时间
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.乱码问题
response.setContentType("text/html;charset=UTF-8");
//2.生成时间
Date date = new Date();
String time = date.toLocaleString();
//3.放入到set-cookie响应头中
response.setHeader("set-cookie","time="+time);
//4.通过请求对象cookie请求头的信息
String cookie = request.getHeader("cookie");
//5.通过响应头对象把获取的时间信息输出到浏览器
if (cookie == null){
response.getWriter().write("您是首次访问此页面");
}else {
response.getWriter().write("上次访问页面的时间:" + cookie);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
};
Cookie类
通过Cookie类来创建Cookie类型的对象,可以设置Cookie类性对象的生命时长,有效路径等属性。
创建Cookie对象
Cookie cookie = new Cookie(String name,String value);
name: cookie的名称
value:代表cookie名称对应的值
设置最大生命时长
cookie.setMaxAge(单位是秒)
如果没有设置最大生命时长,会话结束浏览器就会销毁cookie。
如果设置了最大生命时长,在最大生命时长过程中,如果关闭浏览器(会话结束),cookie会被序列化到本地磁盘中,如果时间到期了,浏览器来进行销毁。
设置有效路径
cookie只能在范围内可以被捕获到。
有效路径指的是,在某一个虚拟路径之下可以获取cookie,虚拟路径无论指向静态资源还是动态资源甚至404都可以获取cookie。如果不设置有效路径就是只能在当前路径下获取cookie, 如果设定有效路径就是在指定路径下可以获取cookie。
发送cookie(服务器到浏览器)
response.addCookie()
获取cookie(从请求对象中来获取)
Cookie[] cookies =request.getCookies();
删除cookie
Cookie类没提供删除cookie的方法
提供一个完全一样的cookie将其最大生命时长设置为0到浏览器,以这种方式来删除cookie。
代码实现(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.util.Date;
@WebServlet("/Servlet/CookieDemo2")
public class ServletCookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.响应乱码
response.setContentType("text/html;charset=UTF-8");
//2.生成时间
Date date = new Date();
String time = date.toLocaleString();
//3.创建Cookie对象
//设置Cookie名称和值
Cookie cookie = new Cookie("time",time);
//设置最大生命时长
cookie.setMaxAge(60*60*24);
//设置有效路径
cookie.setPath(request.getContextPath()+"/");
//4.发送Cookie到浏览器
response.addCookie(cookie);
//通过请求对象获取Cookie
Cookie ck = null;
//5.通过请求头获取Cookie
//把请求头中的cookie里所有的名称返回到数组中
Cookie[] cookies = request.getCookies();
//Cookie类没提供删除cookie的方法
//提供一个完全一样的cookie且最大生命值为0到浏览器来删除
//判断cookie是否一样的标准:同name,同path 1
//遍历数组,查找指定名称的cookie
if (cookies!=null){
for (Cookie c : cookies){
//判断数组中是否有指定名称的cookie
if ("time".equals(c.getName())){
ck = c;
}
}}
//6.把Cookie存储的值响应到浏览器
if (ck == null){
response.getWriter().write("您是首次访问此页面");
}else {
response.getWriter().write("上次访问页面的时间:" + ck.getValue());
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
代码实现删除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;
@WebServlet("/Servlet/CookieDemo3")
public class ServletCookieDemo3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("time","");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}