一、会话概念
会话:一个浏览器客户端和web服务器连续发生的一系列请求和相应的过程。一次会话中包含多次请求和响应。
会话要解决的问题:每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序需要想办法为每个用户保存这些数据。
会话的功能:在一次会话的范围内的多次请求间共享数据。
会话的方式:
- 客户端:Cookie
- 服务端:Session
二、Cookie介绍
Cookie是客户端技术,程序把每个用户的数据以Cookie的形式返回给用户各自的浏览器。当前用户再次访问同一web资源时,就会带着各自的数据访问。这样,web资源处理的就是用户各自的数据了。
1、Cookie的使用步骤:
① 创建Cookie对象,绑定数据
new Cookie(String name, String value)
② 发送Cookie对象
response.addCookie(Cookie cookie)
③ 获取Cookie对象,取出数据
Cookie[] cookie = request.getCookies()
注:cookie的返回值是一个数组。
2、Cookie的实现原理
基于响应头set-cookie和请求头cookie实现,web服务器通过在http相应消息中增加cookie响应头字段将cookie信息发送给浏览器,浏览器通过在htto请求消息中添加cookie请求头字段将cookie回传给web服务器。
3、Cookie的使用细节
① 多个Cookie
一次可以发送多个Cookie,创建多个Cookie对象,使用response调用多次addCookie方法发送Cookie。
② Cookie的保存时长
默认关闭浏览器则销毁Cookie数据,但可设置Cookie,使其持久化存储,setMaxAge(int seconds),参数分为:
丶正数:将Cookie写入硬盘文件,数值大小表示存活时间,单位秒。
丶负数:默认值。关闭即销毁。
丶零:删除Cookie数据。
③ 存储中文
Tomcat8之前,Cookie中不能存储中文数据,需要将中文进行转码,使用URL。Tomcat8之后允许,但不支持特殊数据,建议使用URL编码存储,使用URL解码解析。
4、Cookie共享
①同一个Tomcat
同一个tomcat服务器中部署的多个web项目的Cookie能共享。默认情况是不能共享,但是通过setPath(String path)可以设置Cookie的获取范围,默认情况下是当前的虚拟目录,若需要共享可设置为"/",为当前服务器。
②不同的Tomcat
setDomain(String path):设置以及域名相同,即可在多个Tomcat之间共享Cookie。比如:setDomain(".baidu.com"),则tieba.baidu.com中的Cookie也可共享。
注:一个而域名下只能存储20个cookie最多
三、保存用户上次访问时间(代码)
新建一个cookie.com.hbnu包,并创建一个servlet
package com.hbnu.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.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/cookieServlet1")
public class CookieServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、解决中文乱码
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=utf-8");
//4、获取cookie,并判断是不是我们的cookie
Cookie[] cookies = req.getCookies();
if (cookies != null){ //4.1如果不为空则说明访问过
// 5、如果cookie内有我们的visitedTime的cookie则执行
for (Cookie cookie : cookies) { //把cookies的每一个值赋值给cookie
if (cookie.getName().equals("visitedTime")) { //5.1如果条件为真,说明用户上次登陆过
/*6、获取cookie
此时获取到的是我们的cookie,存储的是系统时间,因为是string类型所以转成long
并且是毫秒的时间戳,需要转变成日期,且格式化成自己习惯的形式
String value = cookie.getValue();*/
long time = Long.parseLong(cookie.getValue()); //获取用户上次访问本网站的时间
Date date = new Date(time); //将时间戳转成日期
//格式化
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");
resp.getWriter().println("您上次访问本网站的时间是:" + simpleDateFormat.format(date));
}
//8、判断输出
if (cookie.getName().equals("username")) {
resp.getWriter().println("</br>您的用户名是:" + cookie.getValue());
}
}
}else { //4.2否则
resp.getWriter().println("这是您第一次访问本网站...");
}
//2、创建我们的cookie,并绑定数据当前的系统时间,到cookie中
Cookie cookie = new Cookie("visitedTime", System.currentTimeMillis() + "");
//7、保存多个cookie
Cookie cookie1 = new Cookie("username","落叶");
//3、将创建好的Cookie返回给浏览器客户端
resp.addCookie(cookie);
//7.1、记得新建的cookie也返回给浏览器
resp.addCookie(cookie1);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
启动,访问这个servlet可以f12查看