Java web后端4 会话 Cookie Session

会话

会话:指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应的过程。

客户端和服务器的请求和响应的过程(对话双方只要有一方发生变化,都属于不同的会话)
超时间隔【距离上一次请求的间隔】,超时后就属于不同的会话
HTTP是无状态的,不保存用户信息
Cookie客户端
Session服务器
在这里插入图片描述

Cookie

Cookie是一种会话技术,它用于将会话过程中的数据保存到用户的浏览器中【保存在客户端的磁盘或缓存(内存)中】,从而使浏览器和服务器可以更好地进行数据交互。

在这里插入图片描述

在这里插入图片描述
用户第一次访问时,没有Cookie
在这里插入图片描述

Cookie API

在这里插入图片描述
Cookie的相关方法
在这里插入图片描述

Cookie–setMaxAge()和getMaxAge()

负数:浏览器一关,缓存就会清空【将Cookie保存在浏览器的缓存中】
默认为-1

在这里插入图片描述

Cookie的案例

/*** Illustration** @author dengqing* @time 2021/10/13* @function cookie上次访问时间*/@WebServlet(name = "Cookie1", value = "/cookie1")
public class Cookie1 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html; charset=UTF-8");//字符输出流PrintWriter out = response.getWriter();Date date = new Date();//格式化输出SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");//获取当前时间String NowTime = sdf.format(date);//创建Cookie对象并保存当前时间到Cookie对象之中Cookie cookie = new Cookie("LastTime", NowTime);//将Cookie信息回写至客户端浏览器response.addCookie(cookie);//设置cookie保存在磁盘中,为90秒;90秒后失效cookie.setMaxAge(90);//把浏览器中所有Cookie返回//Cookie[] cookies:Cookie对象数组Cookie[] cookies = request.getCookies();String LastAccessTime = null;//如果cookies不为空,再循环,防止空指针异常if (cookies != null) {//增强型for循环for (Cookie c : cookies) {//匹配是否有"LastTime" Cookie//"LastTime"字符串写在前面,防止空指针异常if ("LastTime".equals(c.getName())) {//获取Cookie的值,如果为空,则为浏览器第一次访问LastAccessTime = c.getValue();}}}//Cookie的值,如果为空,则为浏览器第一次访问if (LastAccessTime.isEmpty()) {out.write("你是首次访问本站!");} else {//每次刷新,就会重新计算90秒:cookie.setMaxAge(90);//90秒后失效,就又会显示:你是首次访问本站!out.write("你上次访问本站的时间:" + LastAccessTime);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

Session会话

Cookie是键值对,不能存储大量数据【每次放在请求头中】,并且不安全,效率低
所以使用Session存储大量数据,Session是一种将会话数据保存到服务器端的技术
说会话,指Session

Session的创建,由Servlet容器在发起会话时自动创建
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性【32位16进制,16的32次方,2^128次方,ID不会重复,类似IPv6,64位】,当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。
在这里插入图片描述

Session原理

在这里插入图片描述
Session是通过Cookie技术实现的,依赖于名为JSESSIONID的Cookie,它将信息保存在服务器端。Session中能够存储复杂的Java对象,因此使用更加方便。如果客户端不支持Cookie,或者禁用了Cookie,仍然可以通过使用URL重写来使用Session。
在这里插入图片描述

在这里插入图片描述

Session-获取Session对象

不同的请求对象获取的Session对象,不一定不同;因为可能是处于同一次会话
同一个浏览器的不同窗口是同一个Session;不同的浏览器是不同Session

在这里插入图片描述
在这里插入图片描述

Session相关方法

大型项目一般使用时间戳,国内外一致【getLastAccessedTime()】
Sesssion超时,设置为分钟,在超时时间内如果没有任何请求则超时
在这里插入图片描述

invalidate():类似删除Session

在这里插入图片描述

Tomcat的Session超时设置

在这里插入图片描述

Session案例

浏览器不同窗口属于同一次会话
浏览器关闭,则结束会话了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

loginServlet.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!--等效-->
<!--action="http://localhost:8082/WebServletProject_war_exploded/loginServlet"-->
<form action="loginServlet"><!--div标签:把组件分割开--><!--placeholder 是HTML5 中新增的一个属性。placeholder可以用来描述输入字段预期值的简短的提示信息。提示信息会在用户输入值之前显示,一旦用户输入信息该提示就会自动消失。--><!--placeholder :提示用户输入信息--><div><input type="text" name="uname" placeholder="用户名"></div><input type="password" name="upwd" placeholder="密码"></br><div><input type="submit" value="登录"></div></form>
</body>
</html>

LoginServlet.java

/*** Illustration** @author dengqing* @time 2021/10/13* @function Session:实现登录成功后存入Session;获取Sesssion数据*///http://localhost:8082/WebServletProject_war_exploded/loginServlet.html
@WebServlet(name = "LoginServlet", value = "/loginServlet")
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();System.out.println("进入loginServlet登录页面...");//获取login.html页面用户输入的值String name = request.getParameter("uname");String pwd = request.getParameter("upwd");if ("admin".equals(name) && "123".equals(pwd)) {//获取对话SessionHttpSession session = request.getSession();//将当前用户的名称存入Sessionsession.setAttribute("user",name);//<script>alert('登录成功')</script>:JavaScript,弹出警告框out.write("<script>alert('登录成功')</script>");response.sendRedirect("mainServlet");} else {out.write("用户名或密码输入错误");response.sendRedirect("loginServlet.html");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

MainServlet.java

@WebServlet(name = "MainServlet", value = "/mainServlet")
public class MainServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();//获取当前对话的Session对象HttpSession session = request.getSession();//获取Session的用户名称Object user = session.getAttribute("user");//不为空,之前已经登录过,直接访问if (user!=null){out.write("进入MainServelt主页面");out.write("欢迎回来!"+(String)user);}else {out.write("你还没有登录,请先登录后再访问此页面!\n");out.write("<a href='loginServlet.html'>点击此处进行登录!</a>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

Java Bean

JavaBean符合一定规范写的Java类,是一种规范。它的方法命名,构造以及行为必须符合特定的要求:
1.所有属性为private
2.这个类必须具有一个公共的(public)无参构造函数
3.private属性必须提供public的getter和setter来给外部访问,并且方法的命名也必须遵循一定的命名规范
4.这个类是可序列化的,要实现serializable接口

JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。众所周知,属性名称符合这种模式,其他Java 类可以通过自身机制发现和操作这些JavaBean 的属性。

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

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

相关文章

将安全信息应用到以下对象时发生错误 拒绝访问_手机资讯:拒绝「京东金融」事件再次发生|如何避免iPhone 应用私自获取照片...

如今使用IT数码设备的小伙伴们是越来越多了&#xff0c;那么IT数码设备当中是有很多知识的&#xff0c;这些知识很多小伙伴一般都是不知道的&#xff0c;就好比最近就有很多小伙伴们想要知道拒绝「京东金融」事件再次发生|如何避免iPhone 应用私自获取照片&#xff0c;那么既然…

C/C++蓝桥杯1 备赛准备

蓝桥杯信息 算法基础学习 1.学习C基础语法 2. 3.做蓝桥杯的真题 赛题&#xff1a;情况 赛题&#xff1a;国赛 赛题&#xff1a;暴力数学练习 暴力的题目类型

手机qq表白代码大全可复制_街机游戏大全~手机版

街机游戏大全~手机版安卓&#xff1a;街机游戏大全~手机版1、街机游戏2、经典游戏游戏介绍安卓手机街机游戏1500合集&#xff0c;街机模拟器街机游戏可以说是一代80、90后的童年回忆&#xff0c;此合集收录1500多款街机经典游戏&#xff0c;仅限安卓系统&#xff0c;这么多游戏…

C++面试 语言基础

指针和引用之间的区别 指针是一个新的变量&#xff0c;指向一个变量的地址。可以通过这个地址来修改另一个变量&#xff1b;引用是变量的别名&#xff0c;对引用的操作就是对变量本身的操作。int a 996; int *p &a;//p是指针&#xff0c;&在此是求地址运算 int &…

中科大 计算机网络13 FTP文件传输协议

FTP FTP&#xff1a;文件传输协议 早期分享文件采用FTP方式 客户端&#xff1a;下载文件 服务器&#xff1a;上传文件 FTP:控制连接 先建立控制连接【调用一系列Socket API】&#xff0c;服务器守候在21端口;进行身份认证【用户名和口令&#xff0c;明文传输】&#xff1b;…

ulead gif animator_搞笑GIF趣图:这风看来很大啊,今天回不来家了7

原标题&#xff1a;搞笑GIF趣图&#xff1a;这风看来很大啊&#xff0c;今天回不来家了7每天更新搞笑GIF趣图&#xff0c;欢迎关注。这风看来很大啊&#xff0c;今天回不来家了&#xff0c;哈哈狗生最痛苦的事一 滩 猫过个生日 又少了个朋友找到单身的理由了这咋还往回炸爆笑GI…

图像放大 问题 即 二维数组放大

参考链接 参考链接 #include <iostream> #include <vector>int N0,K0;int main(){std::cin>>N>>K;std::vector<std::vector<int>>input(N,std::vector<int>(N, 0)); // std::cout << N << " " << K…

pictureselector 图片路径_AI图片无损放大软件

​不知道大家有没有使用过下面的AI智能图片放大网站&#xff0c;他的图片放大效果整体尚可&#xff0c;但是在高倍放大需要收费&#xff0c;且对图片尺寸和文件大小有一定的限制&#xff0c;今天给大家推荐一款Topaz Labs公司开发的图片无损放大软件(免费使用的哦)。软件介绍这…

中科大 计算机网络14 EMail SMTP简单邮件传输协议 POP3邮件传输协议 IMAP消息访问协议 HTTP超文本传输协议

EMail&#xff1a;电子邮件 协议包括发送和拉取的协议 发送的协议&#xff1a;SMTP简单邮件传输协议 拉取的协议&#xff1a;POP3邮件传输协议,IMAP消息访问协议,HTTP超文本传输协议 HTTP超文本传输协议&#xff1a; 可以上载POST和下载GET文件; 用户代理&#xff1a;撰写发…

人工智能工程师需具备的技能_2020年软件测试工程师需要具备的技能--需要学什么--面试题有哪些(灵魂拷问)...

一、2020年软件测试行业的现状2020年开年&#xff0c;一不小心&#xff0c;【新冠】黑天鹅从头上飘过&#xff0c;持续影响全国乃至全球的经济&#xff0c;软件行业公司也迎来了不少的冲击&#xff0c;那么一直打算入行软件测试行业&#xff0c;或者已经在软件测试行业耕耘多年…

C++ 标准库 书籍学习记录笔记 第5章

5.3 迭代器 前置式递增比后置式递增效率更高&#xff0c;因为后者需要一个额外的临时对象&#xff0c;因为他需要存储一个迭代器原本的位置并将其进行返还&#xff0c;因此最好使用pos&#xff0c;而不是pos&#xff1b; 5.3.1 关联式容器的运用实例 修改map默认的递增的方式…

中科大 计算机网络15 DNS域名解析系统

DNS的必要性 DNS域名解析系统&#xff1a;不是直接给人使用的&#xff0c;而是给其他应用使用的 域名到IP地址的转换【使用&#xff1a;web应用&#xff0c;FTP应用。。。】 在应用层跑的基础设施&#xff0c;为其他应用而使用 网络层的工作的设备使用IP地址&#xff0c;用来…

面试题目汇总

1&#xff0c;for循环的时间复杂度 两层for循环 第二层中 的循环变量继承与上层变量时间复杂度是O(n^2)for循环时间复杂度算法理解_bingkxin的专栏-CSDN博客_for循环时间复杂度 for(int i0;i<N;i) {for(int ji;j<N;j){//此处运行次数:NN-1N-2...1123...NN(N1)/2} } for(…

C++基础1 数据类型 常量

使用Dev CPP作为编程环境、 注意dev cpp5.4.0没有格式化代码功能&#xff0c;不要再设置了 设置的常用快捷键 CtrE:多行注释 CtrlShiftE:取消多行注释 CtrlZ&#xff1a;撤销 CtrlShiftZ:取消撤销 CtrlL:折叠函数 CtrlShifL:取消折叠函数 设置Dev Cpp Dev C初始化&#xf…

amd核芯显卡控制面板自定义分辨率_显卡天梯图2020最新版 2020年5月显卡排行榜天梯图...

转眼五月份就到来了&#xff0c;最近各大厂商可谓是你方唱罢我登场啊&#xff0c;发布会一场接着一场&#xff0c;新品和概念产品等一个接着一个的放出&#xff0c;我相信很多小伙伴们都迫不及待了&#xff01;~下面和小编一起来看看吧。2020年5月显卡排行榜天梯图&#xff1a;…

Python学习9 面向对象 类和对象

面向对象和面向过程 类和对象 类的设计 类的创建 self:相当于当前对象&#xff1b;类似于Java中的this 类的创建和使用&#xff1a; #类的命名&#xff1a;每个单词首字母大写 class Dog:#属性name dogage 11#方法def eat(self):print(eat rice!)dog Dog() print(dog.n…

刷机提示图像和设备不匹配_安卓5.0升级失败如何解决 安卓5.0刷机失败解决方法介绍【教程】...

安卓5.0升级失败怎么办?安卓5.0刷机失败急救方法?谷歌发布了适用于Nexus系列的Android 5.0系统&#xff0c;但是&#xff0c;刷安卓5.0系统时遇到system.img系统镜像找不到的错误提示是怎么回事?谷歌终于发布了适用于Nexus系列的Android 5.0底包和OTA推送&#xff0c;不过第…

华为模拟器eNSP1

eNSP介绍 网络仿真工具平台 路由器AR

postman 不安全网站_接口工具分析(apipost、jmeter、postman)

一、接口都有哪些类型&#xff1f;接口一般分为两种&#xff1a;1.程序内部的接口 2.系统对外的接口系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把 数据库共享给你&#xff0c;他只能给你提供一个他们写好的方法来获取数据…

java-web前端 javascript

介绍 JavaScript是Web中一种功能强大的脚本语言&#xff0c;被设计为向 HTML 页面增加交互性&#xff0c;常用来为网页添加各式各样的动态功能&#xff0c;它不需要进行编译&#xff0c;直接嵌入在HTML页面中&#xff0c;就可以把静态的页面转变成支持用户交互并响应事件的动态…