1、Cookie!
会话:
1、会话:包含多次请求和响应
2、会话的作用:由于Http是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解,不能共享数据,会话就是用于存储浏览器与服务器在请求和响应过程中产生的数据
客户端会话技术:Cookie
在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)
创建Cookie对象:new Cookie(String name,String value);是的,Cookie对象只能储存字符串类型数据发送Cookie对象:response.addCookie(Cookie cookie);获取Cookie对象:Cookie[] request.getCookies();然后遍历获取每一个Cookie对象
SetCookie:// 1.创建cookie对象,设置数据Cookie cookie = new Cookie("name","jack");// 2.通过response,响应(返回)cookieresponse.addCookie(cookie);GetCookie:// 1.通过request对象,接收cookie数组Cookie[] cookies = request.getCookies();// 2.遍历数组if(cookies!=null){for (Cookie c : cookies) {String name = c.getName();String value = c.getValue();System.out.println(name + " : " + value);}}
Cookie实现原理:
基于HTTP协议:请求头cookie和响应头set-cookie
Cookie细节:
Cookie在浏览器的保存时间:
默认情况下,随着浏览器关闭而销毁,但可以设置存活时间
setMaxAge(int x):单位:秒
正数:指定存活时间,持久化浏览器磁盘中,到期后自动销毁
负数:默认浏览器关闭,cookie销毁
零:立即销毁(自杀)
Cookie储存中文:
cookie不能直接存储中文数据,需要编码和解码
URLEncoder.encode(String s, 编码方式)按照指定的编码对s进行URL编码URLDecoder.decode(String s, 解码方式)按照指定的编码对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
在一次会话的多次请求之间共享数据,将数据保存到服务器端
获取HttpSession对象:HttpSession session = request.getSession();使用HttpSession对象,存储数据:session.setAttribute("数据名",数据值);通过request对象,获取session对象HttpSession session = request.getSession();获取数据:session.getAttribute("数据名");
SetSession:// 1.通过rquest对象,获取session对象HttpSession session = request.getSession();// 2.操作session的API,存储数据session.setAttribute("username", "张三");GetSession:// 1.通过rquest对象,获取session对象HttpSession session = request.getSession();// 2.操作session的API,获取数据String username = (String) session.getAttribute("username");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、购物车案例
商品页:
<%--Date: 2021/6/15 Time: 9:32--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>商品页</title><style type="text/css"></style></head><body><h3>商品列表</h3><a href="setSessionServlet?name=电视机">电视机,加入购物车</a><br><a href="setSessionServlet?name=冰箱">冰箱,加入购物车</a><br><a href="setSessionServlet?name=洗衣机">洗衣机,加入购物车</a><br><a href="setSessionServlet?name=电脑">电脑,加入购物车</a><br><a href="/cart.jsp">查看购物车</a><br><script type="text/javascript"></script></body></html>
购物车:
<%@ page import="java.util.Map" %><%--Date: 2021/6/15 Time: 9:32--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>购物车</title><style type="text/css"></style></head><body><table border="1px"><tr><th>商品</th><th>数量</th></tr><%// 1.从session中获取购物车Map<String,Integer> cart = (Map<String, Integer>) request.getSession().getAttribute("cart");if (cart!=null){ //判断购物车中是否添加了商品//遍历商品for (String s : cart.keySet()) {out.write("<tr><td>"+s+"</td><td>"+cart.get(s)+"</td></tr>");}}else{out.write("<tr><td colspan=\"2\">还未添加任何商品</td></tr>");}%></table><a href='/index.jsp'>继续浏览</a><br><script type="text/javascript"></script></body></html>
后端代码:
package com.yunhe.shoppingcart;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.util.HashMap;import java.util.Map;@WebServlet("/setSessionServlet")public class SetSessionServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");// 处理post请求乱码问题response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法//获取sessionHttpSession session = request.getSession();// 1、获取商品名称String name = request.getParameter("name");// 2、返回结果response.getWriter().write("<strong>"+name + "</strong> 已成功加入购物车 <br>");// 3、创建购物车,(从session中获取购物车)if (session.getAttribute("cart")==null) {Map<String, Integer> cart = new HashMap<>();session.setAttribute("cart",cart);}Map<String, Integer> cart = (Map<String, Integer>)session.getAttribute("cart");// 4、判断商品名称是否已经在购物车中if (cart.get(name)!=null) {//已存在,覆盖购物车商品值加一cart.put(name,cart.get(name)+1);}else{ //不存在,加入购物车商品值为一cart.put(name,1);}// 5、把购物车放回session中session.setAttribute("cart",cart);// 6.继续浏览response.getWriter().write("<a href='/index.jsp'>继续浏览</a><br>");// 7.查看购物车response.getWriter().write("<a href='/cart.jsp'>查看购物车</a><br>");}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
