1、Cookie!

会话:

1、会话:包含多次请求和响应
2、会话的作用:由于Http是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解,不能共享数据,会话就是用于存储浏览器与服务器在请求和响应过程中产生的数据
客户端会话技术:Cookie
在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)

  1. 创建Cookie对象:
  2. new Cookie(String name,String value);
  3. 是的,Cookie对象只能储存字符串类型数据
  4. 发送Cookie对象:
  5. response.addCookie(Cookie cookie);
  6. 获取Cookie对象:
  7. Cookie[] request.getCookies();
  8. 然后遍历获取每一个Cookie对象
  1. SetCookie
  2. // 1.创建cookie对象,设置数据
  3. Cookie cookie = new Cookie("name","jack");
  4. // 2.通过response,响应(返回)cookie
  5. response.addCookie(cookie);
  6. GetCookie
  7. // 1.通过request对象,接收cookie数组
  8. Cookie[] cookies = request.getCookies();
  9. // 2.遍历数组
  10. if(cookies!=null){
  11. for (Cookie c : cookies) {
  12. String name = c.getName();
  13. String value = c.getValue();
  14. System.out.println(name + " : " + value);
  15. }
  16. }

Cookie实现原理:

基于HTTP协议:请求头cookie和响应头set-cookie

Cookie细节:

Cookie在浏览器的保存时间:
默认情况下,随着浏览器关闭而销毁,但可以设置存活时间
setMaxAge(int x):单位:秒
正数:指定存活时间,持久化浏览器磁盘中,到期后自动销毁
负数:默认浏览器关闭,cookie销毁
零:立即销毁(自杀)
Cookie储存中文:
cookie不能直接存储中文数据,需要编码和解码

  1. URLEncoder.encode(String s, 编码方式)
  2. 按照指定的编码对s进行URL编码
  3. URLDecoder.decode(String s, 解码方式)
  4. 按照指定的编码对s进行URL解码

Cookie的特点:
1、cookie存储数据在客户端
2、浏览器对于单个cookie的大小有限制(4kb),同一个域名下限制数量(50个)
3、浏览器可以存储cookie的总数量为300个
Cookie的作用:
1、cookie 一般用于存储少量的不太敏感的数据
2、在不登陆的情况下,完成服务器对客户端的身份识别
Cookie的缺陷:
1、不太安全
2、Cookie存储中文比较麻烦(编码,解码)
3、Cookie的value是String类型的,一个Cookie只能存储一个数据
4、一个站点对Cookie是有限制的
5、在设计上有问题:Cookie 是浏览器与服务器之间数据交互的凭证,如果客户端把Cookie清除掉了,服务器就获取不到数据了

2、Session

服务器端会话技术:Session
在一次会话的多次请求之间共享数据,将数据保存到服务器端

  1. 获取HttpSession对象:
  2. HttpSession session = request.getSession();
  3. 使用HttpSession对象,存储数据:
  4. session.setAttribute("数据名",数据值);
  5. 通过request对象,获取session对象
  6. HttpSession session = request.getSession();
  7. 获取数据:
  8. session.getAttribute("数据名");
  1. SetSession:
  2. // 1.通过rquest对象,获取session对象
  3. HttpSession session = request.getSession();
  4. // 2.操作session的API,存储数据
  5. session.setAttribute("username", "张三");
  6. GetSession:
  7. // 1.通过rquest对象,获取session对象
  8. HttpSession session = request.getSession();
  9. // 2.操作session的API,获取数据
  10. String username = (String) session.getAttribute("username");
  11. System.out.println("getSession获取:" + username);

Session的生命周期:

创建:
用户第一次调用request.getSession()方法时创建
销毁:
1、服务器非正常关闭
2、非活跃状态30分钟后
tomcat进行配置 /tomcat安装目录/conf/web,xml
session.invalidate();自杀
作用范围:
一次会话中,多个请求之间
每一个浏览器跟服务器都是独立的会话

URL重写:

不拒绝,不主动,不负责

Session特点:

1、session存储数据再服务器
2、session存储类型任意(Object)
3、session存储大小和数量没有限制(只要内存够大)
3、session存储相对安全

Session与Cookie的区别:

1、session存储数据在服务器端,Cookie在客户端
2、session没有数据大小限制,Cookie有
3、session数据安全,Cookie相对不安全

Session与Cookie的选择:

1、cookie将数据保存在浏览器端,数据相对不安全,由于成本低,对服务器要求不高,可用于判断用户的登录与否
2、session将数据保存在服务器端,数据相对安全,数据的大小要比cookie中的数据灵活很多,成本较高,对服务器的压力较大,用于存放比较敏感的数据

3、购物车案例

商品页:

  1. <%--Date: 2021/6/15 Time: 9:32--%>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>商品页</title>
  6. <style type="text/css">
  7. </style>
  8. </head>
  9. <body>
  10. <h3>商品列表</h3>
  11. <a href="setSessionServlet?name=电视机">电视机,加入购物车</a><br>
  12. <a href="setSessionServlet?name=冰箱">冰箱,加入购物车</a><br>
  13. <a href="setSessionServlet?name=洗衣机">洗衣机,加入购物车</a><br>
  14. <a href="setSessionServlet?name=电脑">电脑,加入购物车</a><br>
  15. <a href="/cart.jsp">查看购物车</a><br>
  16. <script type="text/javascript">
  17. </script>
  18. </body>
  19. </html>

购物车:

  1. <%@ page import="java.util.Map" %><%--Date: 2021/6/15 Time: 9:32--%>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>购物车</title>
  6. <style type="text/css">
  7. </style>
  8. </head>
  9. <body>
  10. <table border="1px">
  11. <tr>
  12. <th>商品</th>
  13. <th>数量</th>
  14. </tr>
  15. <%
  16. // 1.从session中获取购物车
  17. Map<String,Integer> cart = (Map<String, Integer>) request.getSession().getAttribute("cart");
  18. if (cart!=null){ //判断购物车中是否添加了商品
  19. //遍历商品
  20. for (String s : cart.keySet()) {
  21. out.write("<tr><td>"+s+"</td><td>"+cart.get(s)+"</td></tr>");
  22. }
  23. }else{
  24. out.write("<tr><td colspan=\"2\">还未添加任何商品</td></tr>");
  25. }
  26. %>
  27. </table>
  28. <a href='/index.jsp'>继续浏览</a><br>
  29. <script type="text/javascript">
  30. </script>
  31. </body>
  32. </html>

后端代码:

  1. package com.yunhe.shoppingcart;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.annotation.WebServlet;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import javax.servlet.http.HttpSession;
  8. import java.io.IOException;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. @WebServlet("/setSessionServlet")
  12. public class SetSessionServlet extends HttpServlet {
  13. @Override
  14. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  15. request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
  16. response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
  17. //获取session
  18. HttpSession session = request.getSession();
  19. // 1、获取商品名称
  20. String name = request.getParameter("name");
  21. // 2、返回结果
  22. response.getWriter().write("<strong>"+name + "</strong> 已成功加入购物车 <br>");
  23. // 3、创建购物车,(从session中获取购物车)
  24. if (session.getAttribute("cart")==null) {
  25. Map<String, Integer> cart = new HashMap<>();
  26. session.setAttribute("cart",cart);
  27. }
  28. Map<String, Integer> cart = (Map<String, Integer>)session.getAttribute("cart");
  29. // 4、判断商品名称是否已经在购物车中
  30. if (cart.get(name)!=null) {//已存在,覆盖购物车商品值加一
  31. cart.put(name,cart.get(name)+1);
  32. }else{ //不存在,加入购物车商品值为一
  33. cart.put(name,1);
  34. }
  35. // 5、把购物车放回session中
  36. session.setAttribute("cart",cart);
  37. // 6.继续浏览
  38. response.getWriter().write("<a href='/index.jsp'>继续浏览</a><br>");
  39. // 7.查看购物车
  40. response.getWriter().write("<a href='/cart.jsp'>查看购物车</a><br>");
  41. }
  42. @Override
  43. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  44. this.doPost(request, response);
  45. }
  46. }