cookie可以说是一种缓存,cookie不是jsp内置对象,所以我们在使用的时候需要创建它,而cookie是由服务器创建,然后发送给客户端。
Cookie cookie=new Cookie(key,value);
response.addCookie(cookie);
Cookie[] cookies=request.getCookies();
//只能拿到所有cookie,不能只拿一个
语法:
response.sendRedirect(要重定向的页面的相对路径);
语法:
request.getRequestDispatcher(要请求转发的页面的相对路径).forward(request,response);
1: 重定向是两次请求,而请求转发是一次请求
解释:比如我们请求index.jsp页面,再由index.jsp页面重定向到success.jsp页面,那么在请求完index.jsp页面后,index.jsp直接给客户端一个响应,然后客户端再重新发出第二次请求,这次请求是请求页面success.jsp.
而如果是在index.jsp请求转发到success.jsp,那么再请求到达服务器后请求到index.jsp页面时,并不会立即将index.jsp页面响应给客户端,而是直接跳转到success.jsp,在请求success.jsp后再响应到客户端,所以只有一次响应
2:重定向地址栏路径会发生变化,而请求转发地址栏不会发生变化,还是index.jsp的后缀。
我们创建一个web项目,主要用到四个jsp文件,他们分别是index.jsp
index2.jsp, success1.jsp success2.jsp
webapp目录如图:
这个简单项目主要是为了探究以下问题
下面先来看代码:
index.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
Cookie cookie=new Cookie("name","myCookie");
response.addCookie(cookie);
response.sendRedirect("success1.jsp");
%>
success1.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
Cookie[] cookies=request.getCookies();
if(cookies==null){
out.print("cookie为空");
}{
for(int i=0;i ");
}
}
%>
index2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
Cookie cookie=new Cookie("name2","myCookie2");
response.addCookie(cookie);
request.getRequestDispatcher("/success2.jsp").forward(request,response);
%>
success2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
<%
Cookie[] cookies=request.getCookies();
if(cookies==null){
out.print("cokie为空");
}{
for(int i=0;i ");
}
}
%>
测试的理论结果:
*我们分三个步骤验证
以上方法知识用代码验证,不太直观,我们可以通过抓包的方式直观的看到cookie:
1:第一次请求index.jsp页面。可以抓到两个包,分别是index.jsp和success1.jsp:
如下图:
这是index.jsp的,可以看到响应里面有set-cookie:name=myCookie;说明该次请求将name=myCookie这cookie发送给了客户端。
然后看重定向的success1.jsp
可以看到他的请求表头里面有Cookie,后面的键值对正是客户端上储存的。所以success1.jsp可以取到这cookie.
2:请求index2.jsp.
注意到响应标头也有set-cookie字段,但是success2.jsp为什么娶不到呢,因为跳转到success2.jsp页面的时候,该响应还没有发生,但是我们抓包的时候已经响应给服务器了才可以看到。
3重新请求index.jsp
此时看到请求标头的cookie中已经有我们发送给客户端的所有cookie了,所以我们这次请求可以拿到所有cookie。