WEB核心【案例:文件下载,案例:点击切换验证码,几种获取properties资源方式】第十二章

简介: 目录1.文件下载1.1超链接下载:1.2自定义servlet下载1.3小结2.点击切换验证码2.1前置只是-验证码生成2.2分析及代码实现2.3需求2:点击切换验证码-绕过缓存3.几种获取preperties资源方式 超链接下载方式自定义Servlet下载通过自定义Servlet 完善超链接下载,可以下载中文名资源

 1.文件下载

1.1超链接下载:

image.gif编辑

超链接下载方式

image.gif编辑

自定义Servlet下载

image.gif编辑

通过自定义Servlet 完善超链接下载,可以下载中文名资源

image.gif编辑

http://localhost:8080/day08_1/download/hello.jpg

浏览器发来的所有请求,都会进行url-pattern.

完全匹配:尝试寻找servlet,路径为download/hello.jpg,寻找不到,进入下一个匹配

目录匹配:尝试寻找servlet,目录路径为/download/*,寻找不到,进入下个匹配

扩展名匹配:尝试寻找servlet,扩展名为:*.jpg,寻找不到,进入最终匹配

缺省匹配:访问DefaultServlet,把当前/download/hello.jpg,对应的资源通过IO流读取到,写出到响应体中。

超链接下载资源的本质:依靠DefaultServlet。

DefaultServlet遵循的码表为iso8859-1,使得utf-8编码的中文资源名,被解析为乱码,通过乱码无法定位资源的,导致资源找不到。

本质:模仿DefaultServlet,并且将资源名解决乱码

new String("乱码".getBytes("iso8859-1"),"utf-8");

image.gif编辑

1.2自定义servlet下载

image.gif编辑

download.html

<h1>自定义Servlet下载</h1>
<a href="/day08_1/dl?method=download&filename=hello.jpg">hello.jpg</a>
<a href="/day08_1/dl?method=download&filename=你好.rar">你好.rar</a>

image.gif

DownLoadServlet

@WebServlet({"/dl"})
public class DownLoadServlet extends BaseServlet {
    /**
     * 文件下载
     */
    public void download() throws IOException {
        //1、获取参数filename
        String filename = getRequest().getParameter("filename");
        //2、处理文件名乱码
        String resourceName = new String(filename.getBytes("iso8859-1"), "utf-8");
        //3、设置强制弹出下载窗口
        HttpServletResponse response = getResponse();
        // 传递的文件名应该是原来乱码的filename,这样下载窗口经过解码后,就会解为正常内容
        response.setHeader("Content-Disposition","attachment;filename="+filename);
        //4、读取资源文件
        //4.1、资源的绝对路径
        String filePath = getServletContext().getRealPath("/")+"/download/"+resourceName;
        //4.2、文件流读取
        FileInputStream fis = new FileInputStream(filePath);
        //5、写出响应体
        //5.1、获取响应体字节流
        ServletOutputStream out = response.getOutputStream();
        //5.2、使用工具流复制
        IOUtils.copy(fis,out);
        fis.close();
        //因为out流被tomcat控制的,所以不要手动关闭,由tomcat管理
    }
}

image.gif

小结:

    1. get乱码处理:  new String("乱码".getBytes("iso8859-1"),"utf-8");
    2. 强制下载响应头,必须位于getOutputStream()之前。
    3. response.getOutputStream();由tomcat控制的,程序员不要手动关闭。

    1.3小结

    文件下载:服务器把数据传递给浏览器(响应体)

    文件下载,默认依赖的是DefaultServlet,因为解码码表为iso8859-1,会导致中文资源名乱码,导致无法找到。

    自定义Servlet下载:

    强制下载的响应头:response.setHeader("Content-Disposition","attchment;filename="+下载名);

    必须位于 getOutputStream()之前,否则失效。

    2.点击切换验证码

    2.1前置只是-验证码生成

    @WebServlet({"/vc"})
    public class VerfityCodeServlet extends BaseServlet {
        public void vc() throws IOException {
            //若需要看到指定图片,需要手动设置响应体(必须在响应体操作之前设置)
            getResponse().setContentType("image/jpeg;charset=utf-8");
            //向响应体写出一张图片形式的验证码
            String vc = createVerifyCodeImage();
            System.out.println(vc);
        }
    }

    image.gif

    小结:

    验证码本质是一张图片,以响应体的方式传递给浏览器(文件下载)

    为了让浏览器打开解析,需要在响应体操作之前,设置响应体类型:

    getResponse().setContentType("image/jpeg;charset=utf-8")

    2.2分析及代码实现

    image.gif编辑

    login.html

    <img src="/day08_1/vc?method=vc"/>

    image.gif

    VerifyCodeServlet已经在前置知识完成了。

    2.3需求2:点击切换验证码-绕过缓存

    image.gif编辑

    用户默认开启缓存,存在缓存问题:

    因为每次路径都是/day08_1/vc?method=vc ,第一次访问时,该路径就在浏览器上有一张图片了。

    缓存理解为一个map集合:

    Key                                               value

    Url路径                                         该路径的资源

    /day08_1/vc?method=vc              验证码图片

    下次再准备发请求时,发现该路径在浏览器有缓存,直接使用浏览器缓存,而不去请求服务器。

    解决方案:

    绕过缓存,只需要让缓存的地址(key)不同,参数列表,只需要让参数列表每次不同,缓存的地址不同

    可以用随机数

    可以用毫秒值

    <script>
       //页面加载完成时,为图片绑定点击事件
       $(function () {
          $("#vcimg").click(function () {
             this.src="/day08_1/vc?method=vc&t="+new Date().getTime();
          });
       });
    </script>

    image.gif

    小结:

    因为用户端访问时存在缓存问题。

    为了绕过缓存,需要让每次URL访问路径不同。

    让URL最后加入随机的参数列表就可以。

    3.几种获取preperties资源方式

    目标:掌握ServletContext方式获取properties资源方式

    image.gif编辑

    public void run1() throws IOException {
        //类加载器获取资源:SE方式(不启动服务器也能正常执行)
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/p/d1.properties");
        Properties p1 = new Properties();
        p1.load(is);
        System.out.println(p1);
        //ServletContext获取资源:EE方式(必须先启动服务器才能正常执行)
        InputStream is2 = getServletContext().getResourceAsStream("/WEB-INF/classes/com/p/d1.properties");
        Properties p2 = new Properties();
        p2.load(is2);
        System.out.println(p2);
        //ResourceBundle获取:SE方式(不启动服务器也能正常执行)
        ResourceBundle bundle = ResourceBundle.getBundle("com.p.d1");
        System.out.println(bundle.getString("uname"));
    }

    image.gif

    image.gif编辑

    小结:

    建议使用的是ServletContext的getResourceAsStream,该方式的出发目录是发布目录的根目录,不仅能够获取properties,而且还能获取其他资源。

    其他两种方

    注意:

    1、以上三种获取资源方式,获取的是 发布目录下的资源。

    2、ResourceBundle相同路径文件在服务器启动期间,为了防止重复加载浪费内容,会加载一次

    (重新加载,默认关闭服务器,服务器关闭时会卸载内存)

    式,出发目录都是 发布目录的/classes 目录

    最后:

          如果文章对您有帮助,就拿起小手赶紧给博主点赞💚评论❤️收藏💙 一下吧!

          愿我们在未来的日子里。熠熠生辉!!!

    相关文章
    |
    7月前
    |
    Java 数据库 网络架构
    菜鸟之路Day36一一Web开发综合案例(部门管理)
    本文详细记录了基于Spring Boot的Web开发综合案例——部门管理功能的实现过程。从环境搭建到功能开发,涵盖数据库表设计、Spring Boot项目创建、依赖引入、配置文件设置以及Mapper、Service、Controller的基础结构构建。文章重点讲解了查询、删除、新增和修改部门信息的业务逻辑实现,遵循RESTful规范设计接口,并通过统一响应结果类`Result`优化前后端交互体验。借助Spring的IoC容器管理与MyBatis的SQL映射,实现了高效的数据操作与业务处理,最终完成部门管理的全功能开发。
    227 12
    |
    6月前
    |
    XML SQL 前端开发
    菜鸟之路Day37一一Web开发综合案例(员工管理)
    本文介绍了基于Web开发的员工管理综合案例,涵盖分页查询、条件分页查询、删除员工和新增员工四大功能模块。通过前后端交互,前端传递参数(如页码、每页记录数、查询条件等),后端使用MyBatis与PageHelper插件处理数据查询与操作。代码结构清晰,包括Controller层接收请求、Service层业务逻辑处理以及Mapper层数据访问,并结合XML动态SQL实现灵活的条件查询。此外,新增与删除功能分别通过POST与DELETE请求完成,确保系统功能完整且高效。
    199 7
    |
    6月前
    |
    存储 前端开发 Java
    菜鸟之路Day38一一Web开发综合案例(三)
    本文介绍了Web开发中的文件上传与员工信息修改的综合案例,涵盖前端到后端的完整流程。重点讲解了阿里云OSS的集成,包括Bucket创建、密钥获取及SDK使用,并通过Spring Boot实现文件上传功能。同时,详细描述了员工信息查询与修改的操作逻辑,涉及Controller、Service和Mapper层代码实现。最后探讨了配置文件的优化,对比@Value与@ConfigurationProperties注解,展示了如何通过实体类批量注入配置参数,提升代码可维护性与灵活性。
    174 1
    |
    7月前
    |
    Web App开发 前端开发 JavaScript
    鸿蒙5开发宝藏案例分享---Web适配一多开发实践
    这是一份实用的鸿蒙Web多设备适配开发指南,针对开发者在不同屏幕尺寸下的布局难题提供了解决方案。文章通过三大法宝(相对单位、媒体查询和窗口监听)详细介绍如何实现智能适配,并提供了多个实战案例,如宫格布局、对话框变形和自适应轮播图等。此外,还分享了调试技巧及工具推荐,帮助开发者快速上手并优化性能。最后鼓励读者实践探索,并提示更多官方资源等待发现。
    |
    9月前
    |
    移动开发 前端开发 API
    鸿蒙web加载本地网页资源异常
    在鸿蒙NEXT Api 12中,为解决Web组件加载本地资源(如图片、CSS等)失败的问题,我们采用拦截机制。具体步骤如下: 1. **替换路径**:通过正则表达式将HTML和CSS中的资源路径替换为带有标记的URL(如`http://local`),以便后续识别。 2. **拦截与返回**:在资源加载时,拦截带有标记的URL,读取对应的本地文件并返回给Web组件。此过程确保了本地资源能正确加载和显示。 代码实现包括路径替换、资源拦截及响应构建,确保Web页面能够顺利加载本地资源。
    453 7
    |
    前端开发 机器人 测试技术
    【RF案例】Web自动化测试弹窗处理
    在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
    322 6
    【RF案例】Web自动化测试弹窗处理
    |
    前端开发 数据安全/隐私保护
    【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
    本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
    284 6
    【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
    |
    数据采集 自然语言处理 API
    Python反爬案例——验证码的识别
    Python反爬案例——验证码的识别
    381 2
    |
    存储 前端开发 Java
    验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
    本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
    2255 0
    验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
    |
    前端开发
    【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
    本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
    336 11

    热门文章

    最新文章