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 目录

    最后:

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

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

    相关文章
    |
    3月前
    |
    数据采集 自然语言处理 API
    Python反爬案例——验证码的识别
    Python反爬案例——验证码的识别
    56 2
    |
    4月前
    |
    前端开发 机器人 测试技术
    【RF案例】Web自动化测试弹窗处理
    在进行Web自动化测试时,常会遇到不同类型的弹窗,如ajax、iframe、新窗口及alert/Confirm等。这些弹窗可通过Selenium进行定位与处理。其中,ajax弹窗直接定位处理;iframe需先选中再操作;新窗口类似iframe处理;而alert/Confirm则需特殊方法应对。在Robot Framework中,需先定义并获取窗口后使用特定关键字处理。此外,还有部分div弹窗需在消失前快速定位。希望本文能帮助大家更好地处理各类弹窗。
    62 6
    【RF案例】Web自动化测试弹窗处理
    |
    4月前
    |
    前端开发 数据安全/隐私保护
    【前端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;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
    【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
    |
    3月前
    |
    存储 前端开发 Java
    验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
    本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
    398 0
    验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
    |
    4月前
    |
    安全 关系型数据库 MySQL
    Web安全-任意文件下载漏洞
    Web安全-任意文件下载漏洞
    204 5
    |
    4月前
    |
    前端开发
    【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
    本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
    87 11
    |
    4月前
    |
    前端开发
    前端web入门第四天】03 显示模式+综合案例热词与banner效果
    本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。
    |
    4月前
    |
    JavaScript 前端开发
    【前端web入门第一天】03 综合案例 个人简介与vue简介
    该网页采用“从上到下,先整体再局部”的制作思路,逐步分析并编写代码实现个人简介页面。内容涵盖尤雨溪的背景、学习经历及主要成就,同时介绍其开发的Vue.js框架特点。代码结构清晰,注重细节处理,如使用快捷键提高效率,预留超链接位置等,确保最终效果符合预期。
    |
    5月前
    |
    SQL 缓存 自然语言处理
    实战案例1:基于C语言的Web服务器实现。
    实战案例1:基于C语言的Web服务器实现。
    260 15
    |
    5月前
    |
    前端开发 JavaScript API
    【独家揭秘】Bottle框架为何能俘获开发者的心?三大实战案例带你领略Web开发新境界!
    【8月更文挑战第31天】Bottle是一款轻量级Python Web框架,以简单高效著称,秉持极简设计,适合快速开发小型项目或构建API服务。本文通过具体代码示例展示Bottle框架的独特魅力,从安装到创建应用、路由设置、模板渲染及表单处理等方面进行详细介绍,帮助读者轻松上手并掌握Bottle的应用技巧。
    81 1