会话技术——Cookie
目录
- 什么是Cookie?
- 作用
- 实现原理
- Cookie的操作
- Cookie的共享问题
- Cookie的缺陷
- Code
拓展: JavaScript中cookie使用
Cookie
什么是Cookie?
跳转到目录
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户的各自的浏览器.当用户使用浏览器去访问服务器中的web资源时,以后每次请求都将之前保存的共享数据发送到服务器.
作用
跳转到目录
实现会话跟踪.
实现原理
跳转到目录
- 客户端发送请求给服务器
- 服务器发送响应头set-cookie并携带数据给客户端
- 客户端将响应头携带的数据保存到客户端浏览器中
- 下一次请求客户端会使用消息头cookie数据携带给服务器
- 服务器获取消息头中的数据
流程:
首先客户端填写用户名和密码登录请求服务器, 服务器接收到请求参数(用户名或密码)之后将它们保存到Cookie中(Cookie c = new Cookie("用户名 key", "value")
, 多个key-value,创建多个cookie, 将cookie对象通过response.addCookie(c)
写回到客户端,。当下次客户端要登录的时候, 就直接携带请求头中的cookie内容进行登录即可!
Cookie的操作
跳转到目录
创建Cookie对象
Cookie cookie = new Cookie(String name, String value);
name: 当前Cookie取的唯一名字.
value: 存储在Cookie的共享数据,只能是字符串类型.Cookie cookie = new Cookie("currentName", "ZYGui");
把Cookie放入响应中,响应给浏览器,把共享的数据存储到浏览器中
response.addCookie(cookie);
获取Cookie及里面的数据
Cookie[] cs = request.getCookie();
修改Cookie中指定的属性名的属性值
A. 重新创建一个新的Cookie,创建一个同名的新的Cookie.
Cookie c = new Cookie("currentName", "GZY");
B. 先获取到要修改的Cookie对象,再调用setValue(String newValue)
重新设置
注意:修改Cookie中的数据,需要再次发送给浏览器.response.addCookie(c);
操作Cookie的生命周期,默认是在关闭浏览器的时候销毁
- 会话Cookie: 关闭浏览器之后,Cookie就销毁了. 缺省情况
- 持久化Cookie: Cookie可以保存指定的时间段.
设置Cookie的最大存活时间:cookie.setMaxAge(int seconds);
seconds = 0: 删除Cookie;
seconds < 0: 会话Cookie
seconds > 0: 存储指定的秒数.
删除Cookie
cookie.setMaxAge(0);
Cookie 中的key和value不支持中文
- 先对中文字符串进行编码
- 获取之后在进行解码
- 先对中文字符串进行编码
Cookie共享问题
跳转到目录
Cookie的路径
Cookie在创建的时候,会根据当前的Servlet的相对路径
来设置自己的路径
Servlet的相对路径(url-pattern最后的/前面的路径)
比如Servlet的url-pattern为/cookie/login,相对路径:/cookie/
问题: 此时,只有在访问路径为/cookie/下面的资源的时候,才会将该Cookie发送到服务器
解决方案:
设置Cookie的路径
void setPath(String uri)
cookie.setPath("/项目名称");
表示当前应用中的所有的资源都能够共享该Cookie信息
为什么要设置路径,当访问某些页面时,不希望携带cookie.此时就可以设置cookie的携带路径.
路径写法: /项目名称, 所有项目中添加cookie,访问时都会携带.
设置 /项目名称/p, 此时只访问/p时,才携带cookie,其他路径不携带.域范围
在多个应用之间实现数据共享,那么需要设置域范围,比如:news.baidu.com
map.baidu.comcookie.setDomain("baidu.com");
Cookie的缺陷
跳转到目录
- 获取Cookie信息很麻烦
- Cookie不支持中文
- 一个Cookie只能存储一个字符串类型的数据
- Cookie的在浏览器中有数量的限制
一个浏览器对一个站点最多存储20Cookie信息
一个浏览器最多只能够存储300个Cookie - 共享数据时保存在浏览器中的,容易造成数据的泄露(不安全)
最好的解决方案: 将数据保存在服务端(Session)
Code
跳转到目录
- LoginServlet
@WebServlet("/cookie/login") public class LoginServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String username = request.getParameter("username");// 创建Cookie,存储数据Cookie c = new Cookie("currentName", username);c.setPath("/"); // 整个应用中都可以共享// c.setMaxAge(15); 设置15秒后cookie销毁// 把cookie响应给浏览器response.addCookie(c);out.println("欢迎:"+username+"<br>");out.println("<a href='/abc/list'>收件箱</a>");}
- ListServlet
@WebServlet("/abc/list") public class ListServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String username = "";// 获取Cookie的内容Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if ("currentName".equals(name)) {username = value;}}}out.println("欢迎:" + username + "<br>");for (int i = 0; i < 5; i++) {out.println("<a href='/cookie/get'>一封邮件</a><br>");}}
- GetServlet
@WebServlet("/cookie/get") public class GetServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();String username = "";// 获取Cookie的内容Cookie[] cookies = request.getCookies();for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();if ("currentName".equals(name)){username = value;}}out.println("欢迎:"+username+"<br>");out.println("欢迎收看!");}
会话技术——Cookie相关推荐
- 会话技术Cookie
1.会话技术的概念 会话∶浏览器和服务器之间的多次请求和响应. 为了实现一些功能,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器.到了过期时间).这 ...
- java ee会话_Java EE会话技术Cookie和Session
会话技术 一.定义 会话技术是帮助服务器记住客户端状态的(区分客户端的).将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术. 注意: 一次会话何时开始?从打开一个浏览器 ...
- PHP自学之路----会话技术(cookie session)
会话技术 l 什么是会话 打开浏览器,访问某个网站的很多资源(页面=)通过超链接),当你关闭浏览器后,一个会话结束. l 思考一个问题 在意个会话中,用户会产生一些数据,比如购物车,每个用户查看购 ...
- 会话技术 —— Cookie 实现原理 || 在idea编辑器中设置代码的模板
会话技术 1. 会话:一次会话中包含多次请求和响应. * 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 2. 功能:在一次会话的范围内的多次请求间,共享数据 3. ...
- PHP会话技术cookie
为什么要使用会话技术 我们在浏览网站的时候,访问每一个Web页面都是使用HTTP协议来实现的.由于HTTP协议是一个无状态的协议.这就会导致当一个用户请求一个页面以后,再请求该网站的其他页面,HTTP ...
- 四、PHP基础——会话技术Cookie 和 Session
会话技术初步认识 会话技术介绍 web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. HTTP协 ...
- Java Web 项目入门指南(http、Servlet、Request、Response、ServletContext、会话技术[cookie、session]、Filter、Listener)
概述 web 服务器.项目.资源概述 web 服务器:可以被浏览器访问到的服务器 常见的 web 服务器: tomcat:中小型的服务器软件,免费开源,支持 JSP 和 Servlet apache ...
- Java中 操作Servlet域中的值以及会话技术 cookie
XML文件<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="ht ...
- 大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别
会话技术 – Cookie与Session及其两者的区别 (一)会话技术 一.概述 1. 一个浏览器为了实现某一个功能对服务器产生了多次请求响应.从第一个请求开始访问服务器,会话开始,到最后一个页面访 ...
- Java Web 七 会话技术 八 Cookie 九 Session
七 会话技术 打开浏览器,访问服务器中资源,关闭浏览器:这个过程就是会话 分类 * Cookie会话技术:浏览器会话技术* Session会话技术:服务器会话技术 作用 解决ServletContex ...
最新文章
- Spring源码分析【0】-框架的基础:继承和接口调用链
- (0007) iOS 开发之Xcode8上传AppStore遇到的TencentOpenApi_IOS_Bundle.bundle
- nginx报http400错误解决方法
- 【Flutter】Flutter 布局组件 ( PhysicalModel 组件 )
- 80. Leetcode 1642. 可以到达的最远建筑 (堆-技巧三-事后小诸葛)
- weblogic查看内存情况
- java 常量存储_JAVA 存储空间 寄存器 堆栈 堆 常量存储 非RAM存储
- L3-2 至多删三个字符
- 微擎在线goto解密系统
- laravel 下载报错:Unable to guess the mime type as no guessers are available
- mongodb数据导入hbase,spark读取hbase数据分析
- 系统优化设计方案3.20周一例会
- Dockerfile自动创建镜像
- 32个参数累加_「机械设计教程」滚珠丝杠选型过程中考虑的9个参数
- python爬虫之cookie和session介绍——以12306验证码破解和浏览车次为例
- PassMark 更新排行,苹果 M1 杀疯了
- c语言中的整型常量和实型常量
- Module containing this breakpoint has not yet loaded or the breakpoint address not be obtained
- 如何读取PLC的寄存器地址和点表?
- lighttpd隐藏index.php,lighttpd开启rewrite伪静态方法 - 老牛博客