Javaweb05-会话技术(cookie,session)

会话及会话技术

**概念:**在web开发中,服务器跟踪用户的技术为会话技术

Cookie对象

1.Cookie的工作流程

  • cookie可以将会话中的数据保存在浏览器中,通过在响应中添加Set-Cookie头字段将数据保存在自身的缓存中去
  • cookie由浏览器创建
  • cookie在每次请求都会被带到服务器中
image-20240612211648367

2.Cookie API(8个)

  • 构造方法
public Cookie(String name, String value)
注意:在cookie中name是不可以被修改的,value可以修改
  • 常用方法

与本身形式有关的方法

String getName();
void setValue(String name);
String getValue();

在浏览器上保存的时间

void setMaxAge(int m) 默认:m < 0
m > 0 浏览器会将Cookie信息保存到本地磁盘
m < 0 (默认)浏览器会将Cookie信息保存到浏览器缓存,浏览器关闭失效
m = 0 浏览器会立即删除Cookie的信息
int getMaxAge()

设置访问路径

void setPath(String url)
不设置url:只对当前访问路径及其子目录有效
设置url为"/":对站点下的所有目录下的访问路径有效
String getPath()

获取cookie对象

Cookie[] cookies = request.getCookie(); 

将cookie对象送至浏览器端

response.addCookie(Cookie cookie);

3.案例:显示用户上次访问时间

package com.tyut.servlet;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;@WebServlet("/lastAccessServlet")
public class LastAccessServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建响应消息的编码格式response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();//因为localhost可能已经存有某些cookie,因此判断是否为首次访问时需要一个标记符号boolean flag = false;//获取cookie对象Cookie[] cookies = request.getCookies();//获取时间对象SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日-HH:mm:ss");String format = simpleDateFormat.format(new Date());if (cookies != null && cookies.length > 0) {//cookie对象不为空for (Cookie cookie : cookies) {if (cookie.getName().equals("lastTime")) {flag = true;out.write("上次访问网站的时间为" + cookie.getValue());//更新cookie的信息cookie.setValue(format);cookie.setMaxAge(30);//返回cookie对象response.addCookie(cookie);break;}}}if (cookies == null || cookies.length == 0 || flag == false) {out.write("欢迎首次访问此页面!!!");Cookie cookie = new Cookie("lastTime", format);//设置cookie的信息cookie.setValue(format);cookie.setMaxAge(30);//返回cookie对象response.addCookie(cookie);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

4.中文传递

注意:在Tomcat8之后就不存在此问题

String vaule="中文"//将中文转码成UTL编码
value=URLEncoder.encode(vaule,"UTF-8");
//UTL解码
URLDecoder.decode(value,"UTF-8");

Session对象

1.Session的工作流程

  • 当浏览器第一次请求动态资源(Servlet/Jsp)时,Servlet容器会自动创建一个Sesstion对象和id属性

  • 依靠cookie将session id发送至浏览器端保存

  • 之后每次请求浏览器都会携带session id返回至服务器

  • Session是为每一个浏览器对象所创建的

2.Session的优点

  • Session具有更高的安全性,因为session是保存在服务器端的
  • 减少数据传输,减少带宽,因为每次传输的均是sessionId

3.HttpSession Api

  • 获取session对象
request.getSession(boolean create)
1.public HttpSession getSession(boolean create);
如果create为true:在session存在的情况下返回HttpSession对象,不存在的情况下创建一个新session对象
如果create为false:在session存在的情况下返回HttpSession对象,不存在的情况下创建一个null2.public HttpSession getSession();//和boolean create为true一样
  • 常用方法

获得Session中的内容

String getId()//返回HttpSession对象关联的会话标识号
long getCreationTime()//返回Session创建的时间(ms)
long getLastAccessedTime()//返回最后一次与Session相关请求的时间(ms)
ServletContext getServletContext()//返回Session所在的ServletContext对象

与Session生命周期有关的方法

void setMaxInactiveInterval()//设置默认超时时间间隔
int getMaxInactiveInterval()//获得默认超时时间间隔
boolean isNew()//判断对象是否为新创建的对象
void invalidate()//强制使Session对象无效

与Session域对象有关的方法

void setAttribute(String name, Object value)
String getAttribute()
Enumeration getAttributeNames()
void removeAttribute(String name)

4.Session的生命周期

  • Session的生效

1.浏览器第一次访问服务器的动态资源生效,由web容器为浏览器创建一个Session和Id

2.通过request.getSession(true)强制生效

  • Session的失效

1.超时限制

//设置超时的三种方法
1.web.xml中设置超时(单位为分钟)
<session-config><session-timeout>30</session-timeout>    
</session-config>    
2.手动设置session的超时时间
setMaxInactiveInterval(30*60)
3.全局配置session的超时时间,在tomcat中web.xml配置,使得在Tomcat下所有的session有效
默认为30分钟,修改为0或负数表示永不超时
<session-config><session-timeout>30</session-timeout>    
</session-config>    

2.强制失效

void invalidate()//强制使Session对象无效

3.关闭浏览器,session对象存在但会失效,因为session是为每一个浏览器对象创建的

5.案例一:购物车

ListCakeServlet.java

package com.tyut.servlet;import com.tyut.entity.Cake;
import com.tyut.util.CakeDB;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;//展示蛋糕的信息
@WebServlet("/listCakeServlet")
public class ListCakeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建响应消息的编码格式response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();// 获取蛋糕的信息并写入到Servlet页面out.write("<h3>本店拥有的蛋糕如下:</h3><br>");Collection<Cake> cakeList = CakeDB.getAll();for (Cake cake : cakeList) {String url = "purchaseServlet?cakeId=" + cake.getCakeId();//要超链接的页面out.write(cake.getCakeName() + " 价格为:" +cake.getPrice() + "元 <a href= " + url + ">点击购买</a><br>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

PurchaseServlet.java

package com.tyut.servlet;import com.tyut.entity.Cake;
import com.tyut.util.CakeDB;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;//用于添加要购买的商品到购物车的信息
@WebServlet("/purchaseServlet")
public class PurchaseServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String id = request.getParameter("cakeId");//获取要购买商品的id号if (id == null) {//如果id为空则跳转到购买页面不进行处理response.sendRedirect("listCakeServlet");return;}Cake cake = CakeDB.getCakeById(id);//根据id获取蛋糕if (cake == null) {//如果蛋糕不存在则跳转到购买页面不进行处理response.sendRedirect("listCakeServlet");return;}// 蛋糕存在,将其添加到购物车中去HttpSession session = request.getSession();List<Cake> cart = (List<Cake>) session.getAttribute("cart");if (cart == null) {//如果与对象不在,创建此域对象cart = new ArrayList<Cake>();session.setAttribute("cart", cart);}cart.add(cake);// 将Session ID传给浏览器端Cookie cookie = new Cookie("sessionId", session.getId());cookie.setMaxAge(60);cookie.setPath("/");response.addCookie(cookie);// 跳转到购物车页面response.sendRedirect("cartServlet");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

CartServlet.java

package com.tyut.servlet;import com.tyut.entity.Cake;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.io.PrintWriter;
import java.util.List;//用来展示购物车的信息
@WebServlet("/cartServlet")
public class CartServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建响应消息的编码格式response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();List<Cake> cart = null;boolean flag = true;//获取购物车HttpSession session = request.getSession(false);if (session == null) flag = false;else {cart = (List<Cake>) session.getAttribute("cart");if (cart == null) flag = false;}if (!flag) {out.write("您未购买任何东西");} else {//展示购物车double total = 0;out.write("<h3>购物车信息如下:</h3>");for (Cake cake : cart) {total += cake.getPrice();out.write(cake.getCakeName() + "<br>");}out.write("<h4>总计:</h4>" + total + "元");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

6.案例二:模拟用户登录

IndexServlet.java

package com.tyut.servlet;import com.tyut.entity.User;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/indexServlet")
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();HttpSession session = request.getSession();User user =(User) session.getAttribute("user");if (user == null) {out.write("您还没有登录,请先" + "<a href=/web01/login.html>登录</a>");} else {String name = user.getUserName();out.write("欢迎" + name + "祝您用网愉快!!!" + "<a href=/web01/logoutServlet>退出<a>");}}
}

LoginServlet.java

package com.tyut.servlet;import com.tyut.entity.User;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();if ("zhangsan".equals(username) && "123456".equals(password)) {HttpSession session = request.getSession();User user = new User(username, password);session.setAttribute("user", user);Cookie cookie = new Cookie("sessionId", session.getId());cookie.setMaxAge(60);cookie.setPath("/");response.addCookie(cookie);response.sendRedirect("indexServlet");} else {out.write("用户名和密码不匹配,请重新输入");
//            response.sendRedirect("/web01/login.html");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

LogoutServlet.java

package com.tyut.servlet;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet("/logoutServlet")
public class LogoutServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();session.invalidate();response.sendRedirect("indexServlet");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/26394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习笔记】C++每日一记[20240612]

给定两个有序的数组&#xff0c;计算两者的交集 给定两个有序整型数组&#xff0c;数组中 的元素是递增的&#xff0c;且各数组中没有重复元素。 第一时间解法&#xff1a;通过一个循环扫描array_1中的每一个元素&#xff0c;然后利用该元素去比较array_2中的每一个元素&…

采用沙普利值(Shapley value)实现了数据供给方报酬分配的公平性.

目录 采用沙普利值(Shapley value)实现了数据供给方报酬分配的公平性. 采用沙普利值(Shapley value)实现了数据供给方报酬分配的公平性. 采用沙普利值(Shapley value)实现数据供给方报酬分配的公平性,在交易模型中考虑参与个体的异质性与隐私保护,主要体现在以下几个方面…

遥控器无法点击AOSP Settings 的管理存储按钮 MANAGE STORAGE

前言 这里是遇到了MANAGE STORAGE的按钮使用遥控器移动的时候无法聚焦到这个按钮&#xff0c;自然也就无法点击。它只能聚焦到这一整个整体&#xff0c;因此我就设置当点击到这一整个整体时&#xff0c;就相应MANAGE STORAGE按钮的点击事件。 图片 代码 packages/apps/Setti…

探索在线问诊系统的安全性与隐私保护

随着远程医疗的普及&#xff0c;在线问诊系统成为医疗服务的重要组成部分。然而&#xff0c;随着医疗数据的在线传输和存储&#xff0c;患者的隐私保护和数据安全面临巨大挑战。本文将探讨在线问诊系统的安全性与隐私保护&#xff0c;介绍常见的安全措施和技术实现&#xff0c;…

图片转Excel表格:提升数据处理效率的利器

在日常工作和生活中&#xff0c;我们经常遇到各种数据和信息以图片的形式存在。有时&#xff0c;这些数据图片中包含了重要的表格信息&#xff0c;例如财务报告、统计数据或调研结果。为了对这些数据进行进一步的分析和处理&#xff0c;我们需要将其转换为可编辑的电子表格格式…

node 版本控制

官网下载 nvm 包 查看node和npm版本&#xff1a;https://github.com/coreybutler/nvm-windows/releases 2、查看nvm是否安装成功 nvm3、基本使用 1、查看当前node可用版本 nvm ls2、查看当前使用的node版本 nvm current3、安装指定node版本 nvm install 19.9.04、切换版…

构建 deno/fresh 的 docker 镜像

众所周知, 最近 docker 镜像的使用又出现了新的困难. 但是不怕, 窝们可以使用曲线救国的方法: 自己制作容器镜像 ! 下面以 deno/fresh 举栗, 部署一个简单的应用. 目录 1 创建 deno/fresh 项目2 构建 docker 镜像3 部署和测试4 总结与展望 1 创建 deno/fresh 项目 执行命令…

LeetCode 算法: 旋转图像c++

原题链接&#x1f517;&#xff1a; 旋转图像 难度&#xff1a;中等⭐️⭐️ 题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图…

5.冒泡+选择+插入+希尔

一、排序算法 排序基础 1.排序算法的稳定性 2.何为原地排序算法 1.冒泡排序 从下面第一个元素开始往上冒泡&#xff0c;一轮冒泡下来&#xff0c;最大的元素就去了最上面了 步骤&#xff1a;无序数组 每次冒泡都可以将最大的元素放到最右边去 第一轮比较了5次&#xff1a;…

开箱机特点与操作因素:深入剖析影响效率的关键因素

在现代化物流和生产流程中&#xff0c;开箱机作为一种自动化、高效率的设备&#xff0c;正逐渐成为企业提升工作效率、降低人工成本的得力助手。然而&#xff0c;要想充分发挥开箱机的性能优势&#xff0c;就必须深入了解其特点与操作因素&#xff0c;并准确把握影响效率的关键…

Navicat for MySQL 11软件下载附加详细安装教程

根据使用者情况表明Navicat Premium 能使你快速地在各种数据库系统间传输数据&#xff0c;或传输到一份指定 SQL 格式和编码的纯文本文件&#xff0c;计划不同数据库的批处理作业并在指定的时间运行&#xff0c;其他功能包括导入向导、导出向导、查询创建工具、报表创建工具、数…

Idea | Idea提交.properties文件乱码问题

这里 Transparent natice-to-ascii conversion 自动转换ASCII码 千万别勾选

第 5 章:面向生产的 Spring Boot

在 4.1.2 节中&#xff0c;我们介绍了 Spring Boot 的四大核心组成部分&#xff0c;第 4 章主要介绍了其中的起步依赖与自动配置&#xff0c;本章将重点介绍 Spring Boot Actuator&#xff0c;包括如何通过 Actuator 提供的各种端点&#xff08;endpoint&#xff09;了解系统的…

优雅迷人的小程序 UI 风格

优雅迷人的小程序 UI 风格

每日一题——Python实现PAT甲级1116 Come on! Let‘s C(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码点评 时间复杂度分析 空间复杂度分析 总结 我要更强 优化思路 优化…

全球首个光量子计算机生产线落地!量子计算机要量产了

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨娴睿/慕一 排版丨沛贤 深度好文&#xff1a;1000字丨5分钟阅 摘要&#xff1a;欧洲量子计算服务提供商Quandela以其创新的光量子比特生产技术&#xff0c;致力于推动量子计算的工业规模化…

三角剖分技术在AI绘画中的艺术与创新

引言&#xff1a; 随着人工智能技术的不断进步&#xff0c;AI绘画作为一种新兴的艺术创作方式逐渐进入人们的视野。它不仅改变了传统艺术创作的模式&#xff0c;还为艺术家和设计师提供了全新的工具。在AI绘画中&#xff0c;三角剖分技术扮演着至关重要的角色&#xff0c;它不仅…

ABeam News | ABeam德硕受邀参访建王设计,细化双方ESG合作可能点

0523 ABeam News 左起&#xff1a;ABeam大中华区董事长兼总经理中野洋辅、建王设计北京办公室总监田禾、建王设计北京办公室总经理王丽、ABeam中国ESG与可持续发展负责人杨丽楠、ABeam上海办公室王培培 建王 随着ESG&#xff08;环境、社会和治理&#xff09;理念近年来的持续…

Springboot的小型超市商品展销系统-计算机毕业设计源码01635

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

Lua解释器裁剪

本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程&#xff1a; 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪&#xff0c;很简单~ 1、引言 在嵌入式中使用lua解释器&#xff0c;很多时候会面临资源紧张的情况。 同时&#xff0c…