JavaWeb笔记_Session

news2024/9/20 17:29:19

Session概述

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


 

Session的创建和获取

/**
 * HttpServletRequest对象中的方法:
 *   public HttpSession getSession()
 *       如果当前服务端没有session,那就在服务端新建一个session对象
 *       如果在服务端有这个session,那么就直接返回这个session
 * HttpSession中的方法:
 *    void setAttribute(String name, Object value)
 *          向Session中添加数据
 */
   @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //没有session就创建,有就返回
        HttpSession session = request.getSession();

        //添加数据
        session.setAttribute("username","zs");
        //新值覆盖老值
        session.setAttribute("username","ls");

    }
    @Override
    protected 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

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //销毁cookie
        session.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);

            // 将生成字母数字 加入buffer
            buffer.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);
        }

        // 将上面图片输出到浏览器 ImageIO
        graphics.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

    //判断用户输入的验证码与随机生成的验证码是否相等
    @Override
    protected 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.coloradmin.cn/o/1945522.html

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

相关文章

【C++】类和对象之继承

目录 继承的概念和定义 继承的概念 继承的定义 继承的定义格式 继承关系和访问限定符 继承基类成员访问方式的变化 访问权限实例 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 继承与友元 继承与静态成员 复杂的菱形继承及菱形虚拟继承 继承的…

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

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

nacos get changed dataId error, code: 403

nacos get changed dataId error, code: 403问题解决 问题出现原因&#xff1a;解决办法&#xff1a;需要在运行项目的配置添加权限账号和密码,重启服务 问题出现原因&#xff1a; 由于nacosserver开启了权限验证&#xff0c;项目启动时出现异常 nacos.core.auth.caching.ena…

Java基础06:变量,常量,作用域(狂神说Java)

一.变量 有了static&#xff0c;即类变量&#xff0c;就可以不用new了可以直接调用&#xff0c;类变量之后再细讲 二.常量 三.变量的命名规范

权限(linux)

权限就是文件权限&#xff08;linux万物皆文件&#xff09; 本文主要涉及文件/文件夹权限 涉及指令&#xff1a; shell&#xff1a; kernal &#xff1a; linux内核 shell &#xff1a; 外壳 shell可以方便交互与操作 bash是一个具体的shell su su 切换用户 su -root 变…

AppInventor导入导出项目以及打包apk安装包

AppInventor导入导出项目以及打包apk安装包 1.概述 当项目开发好了之后&#xff0c;如果想将项目分享给其他人&#xff0c;或者导入其他人开发的项目怎么办那。 如果给其他人安装你的项目&#xff0c;如何安装那&#xff1f; 2.自带导出和导入功能 导出项目&#xff0c;在P…

【网络】tcp_socket

tcp_socket 一、tcp_server与udp_server一样的部分二、listen接口&#xff08;监听&#xff09;三、accept接收套接字1、为什么还要多一个套接字&#xff08;明明已经有了个socket套接字文件了&#xff0c;为什么要多一个accept套接字文件&#xff1f;&#xff09;2、底层拿到新…

基于VMware(虚拟机) 创建 Ubunton 24.04

目录 1. 设置网络 1. 在安装ubuntu时设置网络 2.在配置文件中修改 2.设置 root 密码 3. 防火墙设置 1 安装防火墙 2 开启和关闭防火墙 3 开放端口和服务规则 4 关闭端口和删除服务规则 5 查看防火墙状态 4. 换源 1. 在创建的时切换源 2.修改源配置 1、Ubuntu24.04 …

MBR60200PT-ASEMI无人机专用MBR60200PT

编辑&#xff1a;ll MBR60200PT-ASEMI无人机专用MBR60200PT 型号&#xff1a;MBR60200PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 批号&#xff1a;最新 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;60A 最大循环峰值反向…

学习华为IPD流程黑话2.0

目录 1、内容简介 2、概念六&#xff1a;管道管理 3、概念七&#xff1a;业务计划 4、概念八&#xff1a;IPMT 的投资活动 5、概念九&#xff1a;BETA、ESS、ESP 作者简介 1、内容简介 学习任何新事物都是从概念开始的。 以我个人最近遇到的一个事为例&#xff1a; 前…

TCP三次握手和四次挥手的理解

三次握手 第一次握手&#xff1a; 客户端发出 请求报文其中SYN应1&#xff0c;选择一个序列号x 第二次握手&#xff1a; 服务端接收到之后回复 确认报文&#xff0c;其中SYN应1&#xff0c;ACK1&#xff0c;确认号是x1&#xff0c;同时为自己初始化序列号y 第三次握手&…

uboot的mmc partconf命令

文章目录 命令格式参数解释具体命令解释总结 mmc partconf 是一个用于配置 MMC (MultiMediaCard) 分区的 U-Boot 命令。具体来说&#xff0c;这个命令允许你设置或读取 MMC 卡的分区配置参数。让我们详细解释一下 mmc partconf 0 0 1 0 命令的含义。 命令格式 mmc partconf &…

go语言day15 goroutine

Golang-100-Days/Day16-20(Go语言基础进阶)/day17_Go语言并发Goroutine.md at master rubyhan1314/Golang-100-Days GitHub 第2讲-调度器的由来和分析_哔哩哔哩_bilibili 一个进程最多可以创建多少个线程&#xff1f;-CSDN博客 引入协程 go语言中内置了协程goroutine&#…

使用水星Mecury人形机器人搭建VR遥操作控制平台!

VR遥操作机械臂是一种将虚拟现实技术与机械臂控制相结合的系统&#xff0c;使用户可以通过虚拟现实设备操控和交互实际的机械臂。这种技术可以应用于多个领域&#xff0c;包括远程操作、培训、危险环境中的工作等。 双臂人形机器人是一种模拟人体上半身结构&#xff0c;包括头部…

手机秒变高清电脑摄像头:轻松实现高清视频通话的方法

你知道手机也可以充当电脑摄像头来使用吗&#xff1f;随着科技的不断发展&#xff0c;手机摄像头的画质效果已经可以满足大多数普通用户的日常需求。很多自媒体平台在考虑性价比上都会优先考虑使用拥有高画质高分辨率的手机进行拍摄、直播。如果你需要临时召开视频会议&#xf…

【C++】类和对象(三)完结篇

个人主页 创作不易&#xff0c;感谢大家的关注&#xff01; 文章目录 ⭐一、再探构造函数1.初始化列表 &#x1f389;二、类型转换&#x1f3e0;三、static成员&#x1f3dd;️四、友元⏱️五、内部类&#x1f388;六、匿名对象&#x1f3a1;七、在拷贝对象时的编译器优化 ⭐一…

WEB漏洞知识点介绍

简要说明以上漏洞危害情况 SQL注入&#xff1a;对应网站数据库权限&#xff0c;通过这个漏洞可以获取到网站数据库里面的数据&#xff0c;范围不同权限不同&#xff1b; 文件上传&#xff1a;找到文件上传的漏洞大部分可以直接获取到网站权限 xss跨站&#xff1a;围绕网站管理…

运维锅总浅析网络攻击与防范

本文介绍常见的网络攻击手法及防御措施&#xff0c;并进一步介绍如何进行安全教育和培训、攻击溯源。希望对您提高网络安全防范意识有所帮助&#xff01; 一、常见的网络攻击手法 网络攻击手法多种多样&#xff0c;以下是一些常见的网络攻击手法及其基本原理&#xff1a; 1.…

MarkTool之TCP客户端

TCP客户端&#xff0c;主要作用是与TCP服务端连接进行数据通讯 1、连接参数就2个&#xff0c;服务器IP和服务器Port&#xff0c;参数设置好&#xff0c;再点连接则会连接成功 2、接收数据和发送数据的参数设置&#xff0c;有16进制&#xff0c;有字符&#xff0c;有原始数据&a…

Linux:基础命令学习

目录 一、ls命令 实例&#xff1a;-l以长格式显示文件和目录信息 实例&#xff1a;-F根据文件类型在列出的文件名称后加一符号 实例&#xff1a; -R 递归显示目录中的所有文件和子目录。 实例&#xff1a; 组合使用 Home目录和工作目录 二、目录修改和查看命令 三、mkd…