JavaWeb笔记_Session

Session概述

Session是一种在服务端记录用户会话信息的技术


 

Session的创建和获取

/*** HttpServletRequest对象中的方法:*   public HttpSession getSession()*       如果当前服务端没有session,那就在服务端新建一个session对象*       如果在服务端有这个session,那么就直接返回这个session* HttpSession中的方法:*    void setAttribute(String name, Object value)*          向Session中添加数据*/@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//没有session就创建,有就返回HttpSession session = request.getSession();//添加数据session.setAttribute("username","zs");//新值覆盖老值session.setAttribute("username","ls");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();//取出数据//注意:session.getAttribute("username")返回值为object类型,并非String类型response.getWriter().write(session.getAttribute("username").toString());}

Session的生命周期

1 默认存活时间

 1.Session默认存活时间:30min (类似会员截至使用期限)
      session默认存活时间:如果会话静置(浏览器不做任何操作)或者关闭浏览器30min后服务端会销毁这个session

      Tomcat的默认配置 conf/controller.xml:针对所有应用的session都生效
       <session-config>
           <session-timeout>30</session-timeout>
       </session-config>

      如果在本应用下的web.xml中配置session超时时间,那么会覆盖掉默认session配置
             <session-config>
                 <session-timeout>10</session-timeout><!--当前应用的session默认存活时间10min-->
             </session-config>

 2 手动销毁Session

    @Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();//销毁cookiesession.invalidate();}

3 Session的钝化与活化

Session钝化(序列化):当我们正常关闭服务器时候,服务器会把内存中session对象存储到硬盘的文件中 (Session从内存=>硬盘)
     Session活化(反序列化):当我们再次启动服务器的时候,服务器会从存储session的文件中,将session对象加载到内存中(Session从硬盘=>内存)
     可以把一部分Session存储到硬盘上节约服务端内存

     当我们正常关闭tomcat的时候,Session对象会钝化到work目录下的一个文件
     在IDEA中重启Tomcat的时候,IDEA会删除work目录重新创建,导致Tomcat读取不到存储Session文件
     解决方案:
       在context.xml中修改钝化Session默认路径:
     <Manager className="org.apache.catalina.session.PersistentManager">
        <Store className="org.apache.catalina.session.FileStore" directory="D:\"> <!--设置Session文件存储位置-->
     </Manager>

Session案例 

GenerateCodeServlet.java
/*** 生成验证码图片*/
@WebServlet("/generateCode")
public class GenerateCodeServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int width = 120;int height = 32;// 步骤一 绘制一张内存中图片BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 步骤二 图片绘制背景颜色 ---通过绘图对象Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔// 绘制任何图形之前 都必须指定一个颜色graphics.setColor(getRandColor(200, 250));graphics.fillRect(0, 0, width, height);// 步骤三 绘制边框graphics.setColor(Color.WHITE);graphics.drawRect(0, 0, width - 1, height - 1);// 步骤四 四个随机数字Graphics2D graphics2d = (Graphics2D) graphics;// 设置输出字体graphics2d.setFont(new Font("宋体", Font.BOLD, 23));String words = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";Random random = new Random();// 生成随机数StringBuffer buffer = new StringBuffer();// 定义x坐标int x = 10;for (int i = 0; i < 4; i++) {// 随机颜色graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));// 旋转 -30 --- 30度int jiaodu = random.nextInt(60) - 30;// 换算弧度double theta = jiaodu * Math.PI / 180;// 生成一个随机数字int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1// 获得字母数字char c = words.charAt(index);// 将生成字母数字 加入bufferbuffer.append(c);// 将c 输出到图片graphics2d.rotate(theta, x, 20);graphics2d.drawString(String.valueOf(c), x, 20);graphics2d.rotate(-theta, x, 20);x += 30;}//将生成的验证码存入到session域中request.getSession().setAttribute("code", buffer.toString());// 步骤五 绘制干扰线graphics.setColor(getRandColor(160, 200));int x1;int x2;int y1;int y2;for (int i = 0; i < 30; i++) {x1 = random.nextInt(width);x2 = random.nextInt(12);y1 = random.nextInt(height);y2 = random.nextInt(12);graphics.drawLine(x1, y1, x1 + x2, x2 + y2);}// 将上面图片输出到浏览器 ImageIOgraphics.dispose();// 释放资源ImageIO.write(bufferedImage, "jpg", response.getOutputStream());}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}/*** 取其某一范围的color** @param fc int 范围参数1* @param bc int 范围参数2* @return Color*/private Color getRandColor(int fc, int bc) {// 取其随机颜色Random random = new Random();if (fc > 255) {fc = 255;}if (bc > 255) {bc = 255;}int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}
}

demo.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>验证码</title><script>function changeCode() {var imgEle = document.getElementById("code");//getTime()获取自1970年1月1日0时0分0秒到现在系统时间毫秒值//每次点击图片我们请求的链接都不同,浏览器就不再访问缓存,而是每次请求都回去请求服务端的servlet//或者直接停用缓存,浏览器就不会访问缓存imgEle.src = "/day12_Cookie/generateCode?time=" + new Date().getTime();}</script>
</head>
<body>
<form action="/day12_Cookie/CheckCore" method="post">请输入验证码:<input type="text" name="outCode"><img src="/day12_Cookie/generateCode" id="code" onclick="changeCode()"><br><input type="submit">
</form>
</body>
</html>

CheckCore.java

    //判断用户输入的验证码与随机生成的验证码是否相等@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=UTF-8");HttpSession session = request.getSession();//通过name值获取验证码String code = session.getAttribute("code").toString();//获取用户输入的验证码String outCode = request.getParameter("outCode");//比较//因为验证码不区分大小写,所以采用equalsIgnoreCase()方法来进行比较if (code.equalsIgnoreCase(outCode)){response.getWriter().write("验证码输入正确");}else {response.getWriter().write("验证码输入错误");}}

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

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

相关文章

Java企业微信服务商代开发获取AccessToken示例

这里主要针对的是企业微信服务商代开发模式 文档地址 可以看到里面大致有三种token&#xff0c;一个是服务商的token&#xff0c;一个是企业授权token&#xff0c;还有一个是应用的token 这里面主要有下面几个参数 首先是服务商的 corpid 和 provider_secret &#xff0c;这个可…

C中字符串处理学习笔记

C中字符串处理学习笔记 目录 C中字符串处理学习笔记1. 字符串长度相关函数1.1 strlen函数1.2 strnlen函数 2. 字符串复制、设置相关函数2.1 strcpy函数2.2 strncpy函数2.3 strlcpy函数2.4 strcat函数2.5 strncat函数2.6 strlcat函数2.7 sprintf函数2.8 snprintf函数2.9 asprint…

mysql常用函数五大类

mysql常用函数 1. 第一类&#xff1a;数值函数1.1 圆周率pi的值1.2 求绝对值1.3 返回数字的符号1.4 开平方&#xff0c;根号1.5 求两个数的余数1.6 截取正数部分1.7 向上取整数1.8 向下取整数1.9 四舍五入函数1.10 随机数函数1.11 数值左边补位函数1.12 数值右边补位函数1.13 次…

83. UE5 RPG 实现属性值的设置

在前面&#xff0c;我们实现了角色升级相关的功能&#xff0c;在PlayerState上记录了角色的等级和经验值&#xff0c;并在变动时&#xff0c;通过委托广播的形式向外广播&#xff0c;然后在UI上&#xff0c;通过监听委托的变动&#xff0c;进行修改等级和经验值。 在这一篇里&a…

鸿蒙开发仓颉语言【Hyperion: 一个支持自定义编解码器的TCP通信框架】组件

Hyperion: 一个支持自定义编解码器的TCP通信框架 特性 支持自定义编解码器高效的ByteBuffer实现&#xff0c;降低请求处理过程中数据拷贝自带连接池支持&#xff0c;支持连接重建、连接空闲超时易于扩展&#xff0c;可以积木式添加IoFilter处理入栈、出栈消息 组件 hyperio…

Mongodb的通配符索引

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第95篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

代理协议解析:如何根据需求选择HTTP、HTTPS或SOCKS5?

代理IP协议是一种网络代理技术&#xff0c;可以实现隐藏客户端IP地址、加速网站访问、过滤网络内容、访问内网资源等功能。常用的IP代理协议主要有Socks5代理、HTTP代理、HTTPS代理这三种。代理IP协议主要用于分组交换计算机通信网络的互联系统中使用&#xff0c;只负责数据的路…

python-基础篇-字符串-是什么

文章目录 定义一&#xff1a;所谓字符串&#xff0c;就是由零个或多个字符组成的有限序列&#xff0c;在Python程序中&#xff0c;如果我们把单个或多个字符用单引号或者双引号包围起来&#xff0c;就可以表示一个字符串。字符串和常用数据结构使用字符串 通过多个角度的定义了…

开局一个启动器:从零开始入坑ComfyUI

前几天刷某乎的时候看到了一位大佬写的好文&#xff0c;可图 IP-Adapter 模型已开源&#xff0c;更多玩法&#xff0c;更强生态&#xff01; - 知乎 (zhihu.com) 久闻ComfyUI大名&#xff0c;决定试一下。这次打算不走寻常路&#xff0c;不下载现成的一键包了&#xff0c;而是…

let、var、const 的区别 --js面试题

作用域 ES5中的作用域有&#xff1a;全局作用域、函数作用域&#xff0c;ES6中新增了块级作用域。块作用域由 { } 包括&#xff0c;if 语句和 for 语句里面的 { } 也属于块作用域。 var 1.没有块级作用域的概念&#xff0c;但具有函数全局作用域、函数作用域的概念 {var a …

【凸优化】二次约束二次规划(QCQP)问题转化为二阶锥规划(SOCP)

二次约束二次规划&#xff08;QCQP&#xff09;问题的SOCP形式转化 1. 问题描述 1.1. QCQP的一般形式&#xff1a; min ⁡ 1 2 x ⊤ Q 0 x c ⊤ x s . t . x ⊤ Q i x a i ⊤ x ≤ b i , i 1 , … , m \begin{aligned} \min \quad &\frac{1}{2}\mathbf{x}^{\top}\math…

移除链表元素 - 力扣(LeetCode)

203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* cur hea…

ubuntu c++ nginx ffmpeg 推流海康摄像头视频

环境&#xff1a;Ubuntu18.04 使用到的库&#xff1a;nginx&#xff0c;ffmpeg 外设&#xff1a;海康任一款摄像头&#xff0c;分辨率&#xff1a;1280*720 Ubuntu c 海康sdk获取原始码流&#xff0c;使用ffmpeg编码推流到nginx服务器&#xff0c;使用vlc即可拉到rtmp图像&a…

别再只知道埋头苦学python了!!学了python后月入1w不在话下,不准你还不知道!!!

在Python接单的过程中&#xff0c;掌握一些技巧、注意相关事项以及选择合适的接单平台是非常重要的 一、Python接单要注意哪些 报酬问题&#xff1a;在接单前&#xff0c;务必明确客户所说的报酬是税前还是税后&#xff0c;以避免后期产生纠纷。时间管理&#xff1a;不要与客户…

Nginx 如何处理 WebSocket 连接?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 如何处理 WebSocket 连接&#xff1f;一、WebSocket 连接简介二、Nginx 处理 WebSocket 连接的基本原理三、配置 Nginx 支持 WebSocket 连接四、Nginx 中的…

【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选

今年&#xff0c;“串串房”一词频繁引发广大网友关注。“串串房”&#xff0c;也被称为“陷阱房”“贩子房”——炒房客以低价收购旧房子或者毛坯房&#xff0c;用极度节省成本的方式对房子进行装修&#xff0c;之后作为精修房高价租售&#xff0c;因甲醛等有害物质含量极高&a…

LeetCode-day23-3098. 求出所有子序列的能量和

LeetCode-day23-3098. 求出所有子序列的能量和 题目描述示例示例1&#xff1a;示例2&#xff1a;示例3&#xff1a; 思路代码 题目描述 给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个 子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请…

“从爱好者到职业画师:一位AI绘画践行者的赚钱实战秘籍“

&#x1f3a8; 【引子&#xff1a;AI绘画&#xff1a;艺术与科技的交汇】 在数字化浪潮席卷全球的今天&#xff0c;人工智能技术以其颠覆性的力量&#xff0c;正悄然改写着艺术创作的传统版图。当AI与绘画碰撞交融&#xff0c;诞生出一种全新的艺术形式——AI绘画。它不仅是科…

别只盯着苹果了,华为Mate70也有AI技术,听说效果让人直接惊呼

随着人工智能技术的不断进步&#xff0c;智能手机行业也迎来了前所未有的变革。苹果、三星等国际知名手机厂商纷纷在新品发布会上重点展示其手机的AI技术&#xff0c;而华为作为中国科技的领军企业&#xff0c;其在AI领域的成就同样不容小觑。 华为Mate系列作为其旗舰系列&…

科研绘图系列:R语言组合热图和散点图

介绍 热图展示参与者的属性,散点图表示样本的时间跨度。 加载R包 library(tidyverse) library(ComplexHeatmap) library(circlize) library(cowplot)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度云盘链接: https://pan.baidu.com/s/1iEE9seTLdrrC3WDHJy…