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

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

时间2025-05-04 16:31:27分类IT科技浏览4775
导读:目录...

目录

1.文件下载

1.1超链接下载:

1.2自定义servlet下载

1.3小结

2.点击切换验证码

2.1前置只是-验证码生成

2.2分析及代码实现

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

3.几种获取preperties资源方式

💟作者简介:大家好呀!我是爱吃豆的土豆  

📝个人主页:【爱吃豆的土豆的博客_CSDN博客-Web知识,spring框架,vue领域博主】

🏆博主信息:人必有所执             ,方能有所成!

🐋希望大家多多支持😘一起进步呀!

🌈若有帮助                   ,还请【关注➕点赞➕收藏

】      ,不行的话我再努力努力呀!💪

⚡版权声明:本文由【爱吃豆的土豆的博客】原创             、在CSDN首发                   、需要转载请联系博主            。

1.文件下载

1.1超链接下载:

 超链接下载方式

自定义Servlet下载

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

浏览器发来的所有请求                   ,都会进行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");

1.2自定义servlet下载

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>

 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管理 } }

小结:

get乱码处理:  new String("乱码".getBytes("iso8859-1"),"utf-8"); 强制下载响应头,必须位于getOutputStream()之前                  。 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); } }

小结:

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

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

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

2.2分析及代码实现

login.html

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

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

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

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

因为每次路径都是/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>

小结:

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

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

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

3.几种获取preperties资源方式

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

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")); }

小结:

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

其他两种方

注意:

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

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

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

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

最后:

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

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

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
seo网站优化工具大全(全面的seo网站优化排名) ghost安装器没反应(GHOST不认硬盘或系统安装一半不能安装了该怎么办?)