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);
}
}