重定向 请求转发 与cookie

什么是cookie

cookie可以说是一种缓存,cookie不是jsp内置对象,所以我们在使用的时候需要创建它,而cookie是由服务器创建,然后发送给客户端。

  1. 服务器端创建cookie
Cookie cookie=new Cookie(key,value);
  1. 服务器端添加cookie到响应中去
 response.addCookie(cookie);
  1. 如何获得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的后缀。

一个cookie的例子来了解这三个知识

我们创建一个web项目,主要用到四个jsp文件,他们分别是index.jsp
index2.jsp, success1.jsp success2.jsp
webapp目录如图:
重定向 请求转发 与cookie_第1张图片
这个简单项目主要是为了探究以下问题

  1. 在index.jsp中新建cookie,用response.addCookie方法发送给客户端,但是我们直接在index.jsp页面中重定向到success1.jsp页面。并且我们在success1.jsp页面中尝试获取所有cookie并打印
  2. 在index2.jsp中新建cookie,用response.addCookie方法发送给客户端,但是我们直接在index2.jsp页面中请求转发到success2.jsp页面。并且我们在success2.jsp页面中尝试获取所有cookie并打印

下面先来看代码:
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");
    }
}
%>


下面我们启动服务器进行测试

测试的理论结果:

  1. 通过重定向可以拿到cookie,因为第一次请求的响应已经将cookie发送给客户端。第二次请求的request对象里面就包含该cookie,也就可以拿到cookie。
  2. 通过请求转发无法拿到cookie,因为请求index.jsp并不会直接响应给客户端,所以cookie也无法发送给客户端保存,在跳转到success2.jsp页面后,request对象还是之前的那个,里面并没有包含cookie,而要等success2.jsp请求完成在响应给客户端时cookie才会被发送给客户端,所以请求转发拿不到cookie

*我们分三个步骤验证

  1. 请求index.jsp页面重定向到success1.jsp,
    重定向 请求转发 与cookie_第2张图片
    我们可以看到拿到了我们放进去的cookie的值muCookie,上面那个是sessionID,学了seesion就会了解这个是什么,就这个问题来讲无视他就行了。而且也应该注意到地址栏也跳到了success1.jsp的后缀。所以第一个结果是符合的。
    2:然后再此基础上我们请求index2.jsp页面
    重定向 请求转发 与cookie_第3张图片
    可以看到这次cookie的值和上次请求的一样,而我们index2.jsp里面放的mycookie2并没有,这是因为这个cookie还没有返回给客户端。现在你可能不能确定是自己代码错误还是真的cookie没有返回到客户端。所以我们再请求一次index.jsp.
    3:请求index.jsp
    重定向 请求转发 与cookie_第4张图片
    这次可以看到取到了mycookie2。说明结果2是正确的,在我们的第二次请求完成后该cookie才返回到客户端保存,所以我们第三次请求才可以取到该cookie.

以上方法知识用代码验证,不太直观,我们可以通过抓包的方式直观的看到cookie
1:第一次请求index.jsp页面。可以抓到两个包,分别是index.jsp和success1.jsp:
如下图:
重定向 请求转发 与cookie_第5张图片
这是index.jsp的,可以看到响应里面有set-cookie:name=myCookie;说明该次请求将name=myCookie这cookie发送给了客户端。
然后看重定向的success1.jsp重定向 请求转发 与cookie_第6张图片
可以看到他的请求表头里面有Cookie,后面的键值对正是客户端上储存的。所以success1.jsp可以取到这cookie.

2:请求index2.jsp.
重定向 请求转发 与cookie_第7张图片注意到响应标头也有set-cookie字段,但是success2.jsp为什么娶不到呢,因为跳转到success2.jsp页面的时候,该响应还没有发生,但是我们抓包的时候已经响应给服务器了才可以看到。

3重新请求index.jsp重定向 请求转发 与cookie_第8张图片
此时看到请求标头的cookie中已经有我们发送给客户端的所有cookie了,所以我们这次请求可以拿到所有cookie。

你可能感兴趣的:(web,cookie)