目录
会话:一次会话中包含多次请求和响应,
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
功能:在一次会话的范围内的多次请求建立连接,共享数据
客户端会话技术Cookie和服务器端会话技术Session
客户端会话技术,将数据保存到客户端
客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie
的响应头,客户端会根据这个响应头存储Cookie
信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie
请求头,而服务器会根据这个请求头进行用户身份、状态等较验。
先创建Cookie对象,绑定数据
new Cookie(String name, String value)
发送Cookie对象
resp.addCookie(Cookie cookie)
获取Cookie对象,拿到数据
Cookie[] cookie = req.getCookie()
- @WebServlet("/only-set-cookie")
- public class OnlySetCookieServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 创建Cookie对象
- Cookie cookie1 = new Cookie("first-name", "first-pwd");
- // 发送Cookie对象
- resp.addCookie(cookie1);
- // 创建Cookie对象
- Cookie cookie2 = new Cookie("second-name", "second-pwd");
- // 发送Cookie对象
- resp.addCookie(cookie2);
- }
- }
- }
- @WebServlet("/only-get-cookie")
- public class OnlyGetCookieServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 获取Cookie对象
- Cookie[] cookies = req.getCookies();
- if(cookies != null){
- for (Cookie cookie : cookies) {
- System.out.println(cookie.getName() + ":" + cookie.getValue());
- }
- }
- }
- }
先在浏览器访问/only-set-cookie,再访问/only-get-cookie
当访问/only-set-cookie时,由于是第一次访问,请求头是不带参数的,但是响应头中有set-Cookie
当访问/only-get-cookie时请求头中有Cookie
(1)Cookie存储数据在客户端浏览器
(2)浏览器对于单个Cookie的大小有一定的限制(4kb),对于同一个域名下的总Cookie数量有限制(20个)
(3)一次可以创建多个Cookie对象,使用response多次调用addCookie方法发送Cookie即可
一次可以创建多个Cookie对象,使用response多次调用addCookie方法发送Cookie即可
默认情况下,当浏览器关闭后,Cookie数据被销毁。但是如果想要持久化存储可以调用setMaxAge(int second)方法设置时间,时间到后,Cookie文件会自动失效。
有时候使用Cookie存取中文会出现乱码的问题,这时候在存取Cookie时需要使用URL编码进行一个编码和解码
编码:String value = URLEncoder.encode("张三", "utf-8");
解码:URLDecoder.decode(cookie.getValue(), "UTF-8");
- @WebServlet("/demo")
- public class Demo extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 创建Cookie对象
- String value = URLEncoder.encode("张三", "utf-8");
- Cookie cookie1 = new Cookie("name", value);
- // 发送Cookie对象
- resp.addCookie(cookie1);
- }
- }
- @WebServlet("/Get")
- public class Get extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 获取Cookie对象
- Cookie[] cookies = req.getCookies();
- for (Cookie cookie : cookies) {
- System.out.println(cookie.getName() + ":" + URLDecoder.decode(cookie.getValue(), "UTF-8"));
- }
- }
- }
在请求头和响应头中看到的是编码之后的内容
在IDEA中打印出来的信息
当使用同一个tomcat启动两个Web项目时,怎么让两个项目获取到的Cookie进行共享
demo1下的Set和Get,demo1下的Cookie是first-name first-pwd
- @WebServlet("/Set")
- public class Set extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 创建Cookie对象
- Cookie cookie = new Cookie("first-name", "first-pwd");
- // 发送Cookie对象
- resp.addCookie(cookie);
- }
- }
- @WebServlet("/Get")
- public class Get extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 获取Cookie对象
- Cookie[] cookies = req.getCookies();
- for (Cookie cookie : cookies) {
- System.out.println(cookie.getName() + " " +cookie.getValue());
- }
- }
- }
demo2下的Set和Get ,demo2下的Cookie是Second-name Second-pwd
- @WebServlet("/set")
- public class Set extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 创建Cookie对象
- Cookie cookie = new Cookie("second-name", "second-pwd");
- // 发送Cookie对象
- resp.addCookie(cookie);
- }
- }
- @WebServlet("/get")
- public class Get extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 获取Cookie对象
- Cookie[] cookies = req.getCookies();
- for (Cookie cookie : cookies) {
- System.out.println(cookie.getName() + " " + cookie.getValue());
- }
- }
- }
先访问/demo1/Set和 /demo1/Get
先访问/demo2/set和 /demo2/get
说明两个项目中获取到的Cookie是不一样的,如果想从demo2中获取到demo1中的Cookie,可以使用cookie.setPath("/");
cookie.setPath("/");
demo1中的Set类
- @WebServlet("/Set")
- public class Set extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // 创建Cookie对象
- Cookie cookie = new Cookie("first-name", "first-pwd");
- // 发送Cookie对象
- cookie.setPath("/");
- resp.addCookie(cookie);
- }
- }
先从demo1中获取到Cookie
再从demo2中获取到Cookie,这样就可以实现Cookie的共享
如果是不同的两个tomcat,怎么让两个项目获取到的Cookie进行共享,使用cookie.setDomain()方法,这个参数必须以“.”开始。 输入url访问的时候,必须输入域名才能解析。如果使用 cookie.setDomain(".new.com");,在另外一个电脑上输入http://home.new.com:8080/就可以获得Cookie,如果输入http://localhost:8080/就不能获得Cookie
cookie.setDomain(".new.com");
(1)Cookie一般用于存储少量的不太敏感的数据
(2)可以在不登陆的情况下,完成服务器对客户端的身份识别
1.访问一个Servlet,如果是第一次访问,提示:欢迎您首次访问
2.如果不是第一次访问,提示:欢迎回来,上次访问时间是:显示字符串
在服务器中的Servlet判断是否存在一个lastTime的Cookie
第一次访问-----提示:欢迎您首次访问,写回Cookie
不是第一次访问-----提示:欢迎回来,写回Cookie
- package cn;
-
- 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.net.URLDecoder;
- import java.net.URLEncoder;
- import java.text.SimpleDateFormat;
- import java.util.Date;
-
- @WebServlet("/lastTimeCookie")
- public class LastTimeCookie extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- resp.setContentType("text/html;charset=utf-8");
- // 1.先获取所有的Cookie
- Cookie[] cookies = req.getCookies();
- if(cookies == null || cookies.length == 0){
- // 第一次访问
- Date date = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String time = sdf.format(date);
- // 因为time中间有个空格,要进行URL编码解码
- time = URLEncoder.encode(time, "utf-8");
- Cookie cookie = new Cookie("lastTime",time);
-
- // 设置Cookie的存活时间,一个月
- cookie.setMaxAge(60 *60 *24 *30);
- resp.addCookie(cookie);
-
-
- resp.getWriter().write("欢迎您首次访问");
-
- }
-
- if(cookies != null){
- for(Cookie cookie: cookies){
- String name = cookie.getName();
- if(name.equals("lastTime")){
- // 获取当前时间,重新设置Cookie值
- Date date = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- String time = sdf.format(date);
- // 因为time中间有个空格,要进行URL编码解码
- time = URLEncoder.encode(time, "utf-8");
- cookie.setValue(time);
-
- // 设置Cookie的存活时间,一个月
- cookie.setMaxAge(60 *60 *24 *30);
- resp.addCookie(cookie);
-
-
- String value = URLDecoder.decode(cookie.getValue(), "utf-8");
- resp.getWriter().write("欢迎回来,上次访问时间是" + value);
- break;
- }
- }
- }
- }
- }
首次访问
第二次访问