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,响应(返回)cookie
response.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 {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
//获取session
HttpSession 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>");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}