什么是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目录如图:

这个简单项目主要是为了探究以下问题

  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" %>
<html>
<head><title>Title</title>
</head>
<body>
<%Cookie cookie=new Cookie("name","myCookie");response.addCookie(cookie);response.sendRedirect("success1.jsp");
%>
</body>
</html>

success1.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body><%Cookie[] cookies=request.getCookies();if(cookies==null){out.print("cookie为空");}{for(int i=0;i<cookies.length;i++){out.print(cookies[i].getValue()+"<br/>");}}%></body>
</html>

index2.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%Cookie cookie=new Cookie("name2","myCookie2");response.addCookie(cookie);request.getRequestDispatcher("/success2.jsp").forward(request,response);
%>
</body>
</html>

success2.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<%Cookie[] cookies=request.getCookies();if(cookies==null){out.print("cokie为空");}{for(int i=0;i<cookies.length;i++){out.print(cookies[i].getValue()+"<br/>");}
}
%>
</body>
</html>

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

测试的理论结果:

  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的值muCookie,上面那个是sessionID,学了seesion就会了解这个是什么,就这个问题来讲无视他就行了。而且也应该注意到地址栏也跳到了success1.jsp的后缀。所以第一个结果是符合的。
    2:然后再此基础上我们请求index2.jsp页面

    可以看到这次cookie的值和上次请求的一样,而我们index2.jsp里面放的mycookie2并没有,这是因为这个cookie还没有返回给客户端。现在你可能不能确定是自己代码错误还是真的cookie没有返回到客户端。所以我们再请求一次index.jsp.
    3:请求index.jsp

    这次可以看到取到了mycookie2。说明结果2是正确的,在我们的第二次请求完成后该cookie才返回到客户端保存,所以我们第三次请求才可以取到该cookie.

以上方法知识用代码验证,不太直观,我们可以通过抓包的方式直观的看到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。

重定向 请求转发 与cookie相关推荐

  1. java重定向cookie_在java中,JSP重定向,转发,Cookie,session

    //第一种情况,先增加Cookie后重定向,A2.jsp能正常获取name的值"你好" //Cookie c=new Cookie("name",URLEnco ...

  2. 【相对/绝对路径】JavaWeb项目中,请求转发与重定向的路径写法

    相对路径.全路径 是要不以/开头,都是相对路径.相对路径是从当前资源出发,去寻找其他资源. 只要路径中以/开肉,就是全路径.全路径是从项目根目录出发,去寻找其他资源. 在开发中,写文件路径时,最好使用 ...

  3. Java Web 请求转发与请求重定向

    Java Web 请求转发与请求重定向 请求转发 服务器行为,即用户向服务器发送了一次http请求,该请求可能会经过多个信息资源处理以后菜返回给用户,各个信息资源使用请求转发机制互相转发请求,但是用户 ...

  4. 请求转发与重定向的区别和执行流程

    请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...

  5. 请求转发(Forward)和重定向(Redirect)

    1.重定向(Redirect) 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL 1.工作原理: 用户第一次通过手动方式通过浏览器访问OneServlet, ...

  6. 重定向sendredirect(URL)和请求转发requestDispatcher(servlet).forword(req,resp)

    请求转发和重定向的区别 什么是请求转发(request.getRequestDispatcher(目标).forward(request,response)) 请求转发是服务器将请求转发给别的serv ...

  7. 【Servlet】请求转发、重定向、Cookie使用之三天自动登陆

    三天自动登陆项目源码:GitHub地址-LoginSystem JDBC 手写SORM框架 手写Servlet 开发环境:Eclipse 一.请求乱码问题解决 // 设置请求.响应编码格式req.se ...

  8. 高薪程序员面试题精讲系列74之你熟悉cookie、session吗?有哪些请求方式?请求转发与重定向有什么区别?

    一. 面试题及剖析 1. 今日面试题 你熟悉servlet与session吗? cookie与session的区别有哪些? 你了解哪些请求方式? get请求与post请求有什么区别? 如何防止post ...

  9. Servlet 重定向,请求转发,多个Servlet间的数据共享(ServletContext、Cookie、HttpSession和HttpServletRequest)

    请求数据包格式: 响应数据包格式: 多个servlet之间的调用规则 重定向解决方案 关于重定向的缺点:对用户来说虽然只需要手动访问一次服务端,剩下的由浏览器自动完成挺好的,但如果浏览器距离服务器很远 ...

最新文章

  1. Android O 前期预研之二:HIDL相关介绍
  2. MongoDB数据库(2.MongoDB对数据库的操作以及Mongodb的增删改查)
  3. java黑色_java-透明的黑色圆圈
  4. VS Code的7个开源替代品,值得推荐!
  5. 基于Mac环境搭建以太坊私有区块链进行挖矿模拟
  6. java删除xml文件中尖括号之外的内容
  7. 谁在指使这家印度 IT 公司攻击全球政治家、投资者和记者?
  8. 恢复出厂设置 卡住10分钟问题
  9. Poj(2312),坦克大战,BFS的变形
  10. retrofit2 上传图片
  11. 日志配置文件详解-logback,log4j
  12. 基于Tiny6410的LCD与一线触屏移植
  13. php 汉王云名片_利用PHP自动生成印有用户信息的名片
  14. DNS服务器地址小总结
  15. Arduino造轮子—智能小夜灯
  16. java去除水印_易剪辑,分享一款免费的去除水印的工具
  17. 制作gif动态图片,LICEcap – 灵活好用,GIF 屏幕录制工具
  18. MOS管的输入阻抗很大带来的问题
  19. 信创操作系统--统信UOS桌面版(文档处理:输入法、语音输入法、WPS、文本编辑器)
  20. java web 播放本地视频文件

热门文章

  1. 小而美:持续盈利的经营法则
  2. vue跳转外部链接始终带localhost,而跳转失败
  3. 惠普HP EliteBook G3官方升级至Windows 10的途径
  4. 【docker】docker常用命令汇总
  5. Azure机器学习——计算目标03:使用 Azure机器学习工作室配置计算目标
  6. 家用计算机装机,2020年装机推荐指南:1100元预算怎么组装家用电脑?
  7. C++/MFC工程[2]——自定义平面直角坐标系
  8. Android: AAPT: error: duplicate attribute.
  9. 【用JS自制表格软件玩数据】6. 单元格的多选
  10. 没有“熊猫“的熊猫快餐,凭什么能成为中式快餐第一?