<讲个故事>cookie是什么?

通过理发店会员卡的例子,本文深入浅出地介绍了Cookie与Session的工作原理。解释了它们如何帮助用户避免频繁登录,并确保信息安全。
cookie
前几天,去"有间"发廊理发,人很多,理发小哥建议办张会员卡,可以VIP通道免排队,还有充599送100的优惠,适逢月初,还没到吃土的时节,充值600,办了会员卡...

会员卡

VIP编号 | 20171011
会员姓名| 昭昭
有效期至| 2018年12月31日

我相当于浏览器客户端,发廊相当于网站服务端;
cookie相当于会员卡;网站产生cookie,由客户端保存;
我以后每次去"有间"发廊要带上会员卡,浏览器客户端,每次向网站发送请求,要带上cookie;

一个月后,我又去理发,换了理发师,为了证明"尊贵的身份",我默默亮出了会员卡...

为什么要使用cookie?

为了避免频繁的登录操作,还能证明我们的身份!
我们浏览网站资源(去理发),只需登录一次(办一次卡),就可以在一定的时限内(2018年12月31日前),随意访问网站的网页(红毛/黄毛/紫毛/烫头/光头/半光头,任你挑...)

我充值了599,会员卡没有注明充值的金额,事实上,发廊也不可能把"余额"信息存在卡片里,如果"余额"被人随意篡改,<"有间"发廊>就会变成<"从前有间"发廊>...

关于session

同理,网站给我们的cookie只是存储了"证明"我们身份的信息,不会把重要的信息存放到cookie中;你可能会问:重要的信息存在哪儿? 答:重要信息存在session中! session由网站数据库保存,保障了信息的安全! session依赖于cookie(正如卡内的"余额"依赖于会员卡)

身份证会采集我们很多的个人信息(指纹,DNA),全面验证我们的个人身份;会员卡只有很少的个人信息,如果手滑把会员卡丢了,其他人获得后,可以直接使用...

cookie的"盗用":

我开通了"某度文库"会员,登录后,我的cookie就有了访问"会员专属"资源的权限,如果有人"盗用"了我的cookie,就可以在不知道我账户和密码的前提下,以我的身份登录网站,下载"会员专属"资源...

cookie是什么

更深一点(假的ATM机:CSRF):

我们的浏览器对于不同网站的cookie是分开存放的,浏览器会根据请求的域名判定,发送不同的cookie(进不同的店,用不同的会员卡!),但这种机制并不安全,比如百度的网站内的某张图片,嵌入了新浪的链接(这个链接可以是一个get请求),如果你点击了这张图片,就相当于对新浪的服务器发送了get请求(请求被人事先精心设计过),上面的这种攻击被称为CSRF(Cross Site Request Forgery),译为跨站请求伪造!
2008年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、YouTube和百度HI等!现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。

### 如何使用 PurchaseServlet 动态生成链接 为了动态生成用于购买书籍的链接,`PurchaseServlet` 的实现需要结合 `HttpServletRequest` 和 `HttpServletResponse` 对象完成以下功能: 1. **接收请求参数** 使用 `req.getParameter()` 方法从客户端传递过来的 URL 参数中提取书籍 ID。此过程可以通过分析传入的 HTTP 请求来完成[^3]。 2. **获取对应书籍信息** 利用书籍 ID 查询模拟数据库中的具体书籍实例。这一步通过调用 `BookDB.getBook(String id)` 来实现,从而返回对应的 `Book` 对象[^5]。 3. **管理购物车逻辑** 借助 `request.getSession(true)` 获取用户的会话对象(如果不存在则创建)。随后将选定的书籍加入到存储于 Session 中的购物车容器内[^4]。 4. **设置 Cookie 并重定向** 创建一个新的 Cookie 存储 sessionID,并将其发送给浏览器;最后执行重定向至 `/chapter08/CartServlet` 完成整个流程[^3]。 下面是具体的代码示例以及解释: ```java @WebServlet("/purchaseServlet") public class PurchaseServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置编码防止中文乱码 resp.setContentType("text/html;charset=UTF-8"); // 1. 接收前端传递来的书籍ID String bookId = req.getParameter("id"); // 2. 根据书籍ID查询书籍信息 Book selectedBook = BookDB.getBook(bookId); if (selectedBook != null){ HttpSession session = req.getSession(); // 如果session中已有购物车,则取出;如果没有就新建一个空列表作为购物车 Object cartObj = session.getAttribute("cart"); List<Book> cart; if(cartObj instanceof List<?>){ cart = (List<Book>) cartObj; }else{ cart = new ArrayList<>(); } // 将选中的书放入购物车内 cart.add(selectedBook); // 更新session里的购物车状态 session.setAttribute("cart", cart); // 3. 把sessionId存放到Cookie中发还给客户机端 Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(60 * 60); // 单位秒,这里设为一个小时有效 resp.addCookie(cookie); // 4. 页面跳转到CartServlet去展示购物车内容 resp.sendRedirect(req.getContextPath()+"/chapter08/CartServlet"); } else { PrintWriter out = resp.getWriter(); out.println("<h1>无法找到该书籍</h1>"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } ``` #### 关键点说明: - 上述代码片段展示了如何利用 Servlet 处理来自用户界面的选择动作,并更新服务器上的购物车记录。 - 当前 Servlet 主要负责三项工作:接受输入、调整共享资源(即购物车),并通过适当方式通知客户端继续下一步操作[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值