程序员社区

【Servlet-2】详细讲解Cookie

在这里插入图片描述
在这里插入图片描述

文章目录

      • 1.Cookie简介
      • 2.Cookie的原理
      • 3.Cookie的默认绑定路径
      • 4.重新设置Cookie的绑定路径
      • 5.设置Cookie的有效期
      • 6.获取请求头中的Cookie

1.Cookie简介

会话由一组请求和响应组成,是围绕一件相关事情所进行的请求和响应,所以这些请求和响应之间一定需要数据传输的,即是需要进行会话跟踪的,然而Http协议是一种无状态协议,在不同的请求之间无法进行数据传输。此时就需要一种可以进行请求间数据传递的跟踪技术,而Cookie就是这样一种技术。
Cookie由服务器生成,保存在客户端的一种信息载体,这个载体中存放着用户访问该站点的会话信息,只要Cookie没有失效,那么保存在其中的会话状态就有效。
用户在提交第一次请求之后,由服务器生成Cookie,并将其封装在响应头中,以响应的形式发送给客户端,客户端收到这个响应后,将Cookie保存在客户端,当客户端再次发送同类请求后,在请求中会携带保存在客户端的Cookie数据,发送到服务端,由服务器进行会话跟踪。

2.Cookie的原理

在这里插入图片描述
Cookie的默认绑定路径为:项目的资源路经

package Cookie;
import javax.servlet.http.Cookie;
import java.io.IOException;

@javax.servlet.annotation.WebServlet("/CookieDemo")
public class CookieDemo extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //创建两个Cookie
        Cookie cookie1 = new Cookie("username","zhangsan");
        Cookie cookie2 = new Cookie("password","123");
        //向响应中添加Cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述
如上面视频:
第一次发送请求时:
虚拟路径为/35,第一次发送一个请求http://localhost:8080/35/CookieDemo时,服务器生成Cookie,并封装在响应头中,所以可以看到第一次发送请求时,响应头中有一个Set-Cookie:"username=zhangsanpassword=123",以响应的形式发送给客户端,客户端收到这个响应后,将Cookie保存在客户端。
在这里插入图片描述

第二次发送同类请求时:
当客户端再次发送同类请求时(注意Cookie默认绑定的为资源路径/35)http://localhost:8080/35/CookieDe,在请求中会携带保存在客户端的Cookie数据,发送到服务端,由服务器进行会话跟踪。
在这里插入图片描述

3.Cookie的默认绑定路径

Cookie默认绑定路径为项目的资源路径
如果请求的路径为http://localhost:8080/35/xxx,那么在请求头中都会携带一个Cookie,否则不会携带Cookie

第一次请求时:
在这里插入图片描述
第二次请求时只要是Cookie的绑定路径加上任何路径都是Cookie的同类路径
例如:http://localhost:8080/35/xxx
这时请求头上就会携带Cookie信息。
在这里插入图片描述
如果再次发送的请求不是Cookie绑定的路径,那么请求头中就不会携带Cookie信息。
在这里插入图片描述

4.重新设置Cookie的绑定路径

在这里插入图片描述

package Cookie;
import javax.servlet.http.Cookie;
import java.io.IOException;

@javax.servlet.annotation.WebServlet("/CookieDemo")
public class CookieDemo extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //创建两个Cookie
        Cookie cookie1 = new Cookie("username","zhangsan");
        Cookie cookie2 = new Cookie("password","123");

        //指定Cookie的绑定路径
        //指定Cookie的绑定路径
        //cookie1.setPath("/35/ghh");
        //cookie2.setPath("/35/jh/aaa");
        cookie1.setPath(request.getContextPath()+"/ghh");
        cookie2.setPath(request.getContextPath()+"/jh/aaa");
        
        //向响应中添加Cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述
如视频所示:
将cookie1的路径绑定为/35/ghh
将cookie2的路径绑定Wie/35/jh/aaa
第一次发送请求路径为:http://localhost:8080/35/CookieDemo
在这里插入图片描述
如果此时第二次请求时,再发送默认的Cookie绑定路径,请求头中不会携带相关信息:

在这里插入图片描述
如果再次发送的请求路径中是cookie1绑定路径的同类请求:
cookie1的绑定路径为:http://localhost:8080/35/ghh
在这里插入图片描述
如果再次发送的请求路径中是cookie2绑定路径的同类请求:
cookie1的绑定路径为:http://localhost:8080/35/jh/aaa
在这里插入图片描述

5.设置Cookie的有效期

一般情况下,可以理解为关闭浏览器就代表本次会话结束,如果不设置cookie的存活时间,或者不将其写入硬盘中,那么就会存在浏览器的缓存中,关闭浏览器时,会话就结束了。那么再发同类请求时,请求头中也不会有cookie。

如果不将cookie写入硬盘:
在这里插入图片描述
在不关闭浏览器的情况下,发送同类请求时,可以在请求头中携带Cookie信息:
在这里插入图片描述
在关闭浏览器后,发送同类请求时,不可以在请求头中携带Cookie信息:
在这里插入图片描述

如果将Cookie写入硬盘中:
设置Cookie的有效期,这个值为一个整型值,单位为秒
 该值大于0,表示将cookie存放到客户端的硬盘。
 该值等于0,表示cookie一生成,马上失效。
 该值小于0,表示cookie存放到浏览器的缓存中,与默认设置设置相同。

package Cookie;

        import javax.servlet.http.Cookie;
        import java.io.IOException;

@javax.servlet.annotation.WebServlet("/CookieDemo")
public class CookieDemo extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //创建两个Cookie
        Cookie cookie1 = new Cookie("username","zhangsan");
        Cookie cookie2 = new Cookie("password","123");

        //指定Cookie的绑定路径
        //cookie1.setPath("/35/ghh");
        //cookie2.setPath("/35/jh/aaa");
        cookie1.setPath(request.getContextPath()+"/ghh");
        cookie2.setPath(request.getContextPath()+"/jh/aaa");
        
        //设置Cookie的有效期
        cookie1.setMaxAge(60*60);
        cookie2.setMaxAge(60*60*24);
        

        //向响应中添加Cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述
在不关闭浏览器时,发送同类请求时,可以在请求头中携带Cookie信息:
在这里插入图片描述
在关闭浏览器后,发送同类请求时,仍然可以在请求头中携带Cookie信息:
在这里插入图片描述

6.获取请求头中的Cookie

CookieDemo文件:

package Cookie;

        import javax.servlet.http.Cookie;
        import java.io.IOException;

@javax.servlet.annotation.WebServlet("/CookieDemo")
public class CookieDemo extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        //创建两个Cookie
        Cookie cookie1 = new Cookie("username","zhangsan");
        Cookie cookie2 = new Cookie("password","123");

        //向响应中添加Cookie
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        this.doPost(request, response);
    }
}

CookieDemo2文件:

package 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("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求中的Cookie
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie:cookies){
            System.out.println(cookie.getName()+"="+cookie.getValue());
            if(cookie.getName().equals("username")&& cookie.getValue().equals("password")){
                //...
            }else{
                //...
            }
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

在这里插入图片描述

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 【Servlet-2】详细讲解Cookie

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区