JavaWeb | 验证码 、 文件的“上传”与“下载”
目录:
- 验证码 和 文件的“上传”与“下载”
- 1.验证码
- 1.1在JSP上开发验证码
- 2.“文件上传” 和 “文件下载”
- 2.1“文件上传 ”
- 2.2“文件下载”
验证码 和 文件的“上传”与“下载”
1.验证码
- 验证码:就是由服务器生成的一串随机数字或符号形成一幅图片,图片应该传给客户端,为了防止客户端用一些程序进行自动识别,在图片中通常需要添加一些干扰因素,由用户用肉眼来识别。
- 验证码在网络投票、交友论坛、网上商城等业务经常用来防止恶意客户侵入、恶意灌水、刷票。
1.1在JSP上开发验证码
loginForm.jsp
<%@ page language="java" pageEncoding="gb2312" %> <html> <head><title>第十三章 loginForm.jsp</title> </head> <body> 欢迎登录本系统<br> <form action="/com/servlets/ValidateServlet" method="post">请输入你的账号: <input type="text" name="account"/><br>请输入你的密码: <input type="password" name="password"/><br>验证码: <input type="text" name="code" size="10"/><br><!-- 当验证码当做图片处理 --><img src="validate.jsp" border=0><input type="submit" value="登录"> </form> </body> </html>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 访问到ValidateServlet.java类 --> <servlet><servlet-name>validateServlet</servlet-name><servlet-class>com.servlets.ValidateServlet</servlet-class> </servlet><servlet-mapping><servlet-name>validateServlet</servlet-name><url-pattern>/com/servlets/ValidateServlet</url-pattern> </servlet-mapping> </web-app>
ValidateServlet.class
/* 验证输入的验证码是否正确 */ public class ValidateServlet extends HttpServlet { //用来验证表单登录的servletprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到提交的验证码String code = request.getParameter("code");//获取session中的验证码HttpSession session = request.getSession();String randomStr = (String)session.getAttribute("randomStr"); //获取存储在session中的验证码response.setCharacterEncoding("gb2312");PrintWriter out = response.getWriter();//判断输入的验证码和生成的验证码是否相等if (!code.equals(randomStr)) {out.println("验证码错误!"); //在页面上显示} else {out.println("验证码正确!跳转到LoginServlet...");}} }
validate.jsp
<%@ page import="java.awt.image.BufferedImage" %> <%@ page import="java.awt.*" %> <%@ page import="java.util.Random" %> <%@ page import="javax.imageio.ImageIO" %> <%@ page contentType="text/html;charset=gb2312" language="java" %> <html> <head><title>第十三章 validate.jsp</title> </head> <body> <%response.setHeader("Cache-Control","no-cache");int width = 60;int height = 20;//1.实例化cBufferImage 对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//2.从BufferImage中获取画笔Graphics类对象Graphics g = image.getGraphics();//设置画笔的属性g.setColor(new Color(200,200,200)); //设置颜色 / 设置背景颜色g.fillRect(0, 0, width, height); //设置生成的图片为长方形//3.生成随机数(4位数字)Random random = new Random();//这个随机数没有“种子”,用默认种子int randomNum = random.nextInt(8999) +100; //左闭右开//转换为字符串String randomStr = String.valueOf(randomNum);//存入Session中session.setAttribute("randomStr",randomStr);//将验证码显示在图像中//用画笔画出干扰线和干扰电g.setColor(Color.black);g.setFont(new Font("", Font.PLAIN, 20));g.drawString(randomStr,10,17);//产生干扰点for (int i = 0; i < 100; i++) {int x = random.nextInt(width);int y = random.nextInt(height);g.drawOval(x,y,1,1);//干扰点为一个一个圆}//输出图像到页面response.setContentType("image/jpeg");ImageIO.write(image, "JPEG", response.getOutputStream());out.clear();out = pageContext.pushBody(); %> </body> </html>
loginForm_refresh.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>第十三章: loginForm_refresh.jsp</title> </head> <body> <%-- 具有刷新验证码功能的loginForm页面 --%> <%-- 重新刷新验证码--%> <script>function refresh() {//当点击验证码图片时就重新刷新img标签中的url//让url后面带一个随机数参数,来让每次访问的路径不一样,得到的验证码也不一样loginForm.imgValidate.src = "validate.jsp?id=" + Math.random() +";"} </script> 欢迎登录本系统<br> <%-- action中访问的为web.xml 中servlet标签中的 url --%> <form name="loginForm" action="/com/servlets/ValidateServlet" method="post">请输入你的账号: <input type="text" name="account"/><br>请输入你的密码: <input type="password" name="password"/><br>验证码: <input type="text" name="code" size="10"/><br><!-- 当验证码当做图片处理 ,为该img标签添加"点击事件",让它被点击时,刷牙验证码--><img name = "imgValidate" src="validate.jsp" οnclick="refresh()" border=0><input type="submit" value="登录"> </form> </body> </html>
2.“文件上传” 和 “文件下载”
2.1“文件上传 ”
- 在Java Web应用开发中,文件的上传是必不可少的,如上传简历、上传图片、上传资源代码等。
- 要实现文件上传,要导入 : jspsmart文件上传包。
fileTest.jsp :
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" %> <html> <head><title>第十三章 文件上传: fileTest.jsp</title> </head> <body> <form method="post" name="upload"> 请你选择一个文件进行上传:<input type="file" name="myFile"><br><input type="submit" value="上传"><br> </form> </body> </html>web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>uploadServlet</servlet-name><servlet-class>com.servlets.UploadServlet</servlet-class> </servlet><servlet-mapping><servlet-name>uploadServlet</servlet-name><url-pattern>/UploadServlet</url-pattern> </servlet-mapping> </web-app>UploadServlet.java
public class UploadServlet extends HttpServlet { //关于文件上传的Servlet类@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//创建SmartUpload对象,其负责文件的上传SmartUpload smartUpload = new SmartUpload();//初始化SmartUpload对象//获得ServletConfig对象ServletConfig config = this.getServletConfig();smartUpload.initialize(config, request, response);try {//上传文件--调用.upload()方法上传文件smartUpload.upload();//获得上传的文件File file = smartUpload.getFiles().getFile(0);//保存文件file.saveAs("/S:/aaa/"+file.getFileName(),smartUpload.SAVE_PHYSICAL); //这个是存储在S盘中(物理路径存储)//file.saveAs("/img/"+file.getFileName(),smartUpload.SAVE_VIRTUAL);} catch (SmartUploadException e) {e.printStackTrace();}//上传成功了,保存成功上传的信息String msg = "Upload Success!";request.setAttribute("msg", msg);RequestDispatcher rd = request.getRequestDispatcher("/upload/第十三章/文件上传/uploadForm.jsp"); //上传完之后又回来点击内容进行上传的页面rd.forward(request, response);} }
2.2“文件下载”
download2.jsp
<%@ page language="java" pageEncoding="GB2312" import="java.util.*" %> <html> <head> <title>第十三章 文件下载: download2.jsp</title> </head> <body> 文件下载 <hr> <a href="/第十三章/文件下载/download.jsp?filename=java.jpg">下载</a> </body> </html>download.jsp
<%@ page language="java" pageEncoding="gb2312" import="java.util.*" %> <html> <head><title>文件下载: download.jsp</title> </head> <body> <%String filename = request.getParameter("filename"); //获得url传参传递过来的参数//告诉客户端出现下载框,并指定下载框中的文件名response.setHeader("Content-Disposition","attachment;filename="+filename);//指定文件的类型response.setContentType("image/jpeg"); //jpeg//指定文件RequestDispatcher rd = request.getRequestDispatcher("/S:/aaa/"+filename);//rd.forward(request,response); %> </body> </html>此处给出常见文件对应的contentType类型,主要包括以下几种:
bmp : “application/x-bmp”;
doc: “application/msword”;
exe: “application/x-msdownload" ;
jpg: “image/jpeg" ;
mdb: “application/ msaccess”;
mp3: " audio/mp3”
pdf:”application/pdf";
ppt:”application/ vnd. ms-powerpoint";
rm:”application/vnd. rn- realmedia";
rmvb: “application/vnd. rn-realmedia-vbr”;
swf: “application/ x-shockwave-flash”;
xIs: “application/vnd. ms-excel”。
相关文章:
JavaWeb | 验证码 、 文件的“上传”与“下载”
目录: 验证码 和 文件的“上传”与“下载”1.验证码1.1在JSP上开发验证码 2.“文件上传” 和 “文件下载”2.1“文件上传 ”2.2“文件下载” 验证码 和 文件的“上传”与“下载” 1.验证码 验证码:就是由服务器生成的一串随机数字或符号形成一幅图片&am…...
服务器感染了.halo勒索病毒,如何确保数据文件完整恢复?
导言: 随着科技的不断发展,网络安全问题日益突出,而.halo勒索病毒正是这个数字时代的一大威胁。本文将深入介绍.halo勒索病毒的特点,解释在受到攻击后如何有效恢复被加密的数据文件,并提供一些建议以预防未来可能的威…...
docker安装elasticsearch8.5.0和kibana
服务器环境,centos7 一、安装elasticsearch 1. 创建一个es和kibana通用的网络 docker network create es-net 2. 拉取es镜像,这里选择8.5.0版本 docker pull elasticsearch:8.5.03. 创建挂载目录,并授权 mkdir /usr/local/install/ela…...
如何使用内网穿透工具实现公网访问GeoServe Web管理界面
文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址6. 结语 前言 GeoServer是OGC Web服务器规范的J2EE实现,利用GeoServer可以方便地发布地图数据,允许用户对要素数据进行更新、删除…...
koa2项目中封装log4js日志输出
1.日志输出到控制台 npm i log4js -D 封装log4js文件: 注意:每次都要重新获取log4js.getLogger(debug)级别才能生效 const log4js require("log4js");const levels {trace: log4js.levels.TRACE,debug: log4js.levels.DEBUG,info: log4js.…...
C# WPF上位机开发(抽奖软件)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 每到年末或者是尾牙的时候,很多公司都会办一些年终的清楚活动,感谢员工过去一年辛苦的付出。这个时候,作为年会…...
搭建部署Hadoop2.x和3.x的区别
文章目录 2.x 和 3.x 的区别Java最小支持版本常用的端口号配置文件Classpath隔离NodeManager重连 进入官网自行查阅 2.x 和 3.x 的区别 Java最小支持版本 Hadoop 2.x:2.7 版本需要 Java 7,2.6 以及更早期版本支持 Java 6Hadoop 3.x:最低要求…...
Java爬虫攻略:应对JavaScript登录表单
问题背景 在进行网络抓取数据时,经常会遇到需要登录的网站,特别是使用JavaScript动态生成登录表单的情况。传统的爬虫工具可能无法直接处理这种情况,因此需要一种能够模拟用户行为登录的情况解决方案。 在实际项目中,我们可能需要…...
基于单片机的电子密码锁设计
1.设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的电子密码锁,可设置四位密码,输入错误三次,报警灯亮起(红灯亮起),输入正确,绿灯闪烁三次。可通过LCD显示屏查看密码&…...
ChatGPT学习笔记
1 ChatGPT架构图 (ChatGPT_Diagram.svg来自于【OpenA | Introducing ChatGPT】) 2 模型训练 ChatGPT在训练时使用了PPO方法;...
One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记
One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记 Abstract 一对一(o2o)标签分配对基于变换器的端到端检测起着关键作用,最近已经被引入到全卷积检测器中,用于端到端密集检测。然而,o2o可能因为…...
Ubuntu22.04 使用Docker部署Neo4j出错 Exited(70)
项目场景: 最近需要使用Neo4j图数据库,因此打算使用docker部署 环境使用WSL Ubuntu22.04 问题描述 拉下最新Neo4j镜像,执行命令部署 启动容器脚本 docker run -d -p 7474:7474 -p 7687:7687 \ --name neo4j \ --env "NEO4J_AUTHneo…...
【数据分析 | Numpy】Numpy模块系列指南(一),从设计架构说起
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
多人聊天室
多人聊天包 由于要先创建服务面板,接收客户端连接的信息,此代码使用顺序为先启动服务端,在启动客户端,服务端不用关,不然会报错。多运行几次客户端,实现单人聊天 1.创建服务面板 package yiduiy;import j…...
智慧园区可视化综合管理平台建设方案,智能化、数字化才是关键
园区作为城市的基本单元,是经济发展的重要载体。随着我国经济的快速发展,各类工业园区、办公园区等园区的规划建设也越来越多。伴随着互联网新兴技术的发展和应用,智慧园区已成为当今城市规划和社会发展的关注焦点,今天我们来介绍…...
kepler.gl部署在线说明文档
1 概述 1.1 介绍 1、Kepler.gl 是一个强大的开源地理空间分析工具,用于大规模数据集的可视化。它由 Uber 的数据可视化团队开发,并且是基于 Web 技术构建的。Kepler.gl 涉及到以下几个主要技术领域: WebGL: Kepler.gl 通过 WebGL 进行渲染…...
Java程序员,你掌握了多线程吗?
文章目录 01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写作末尾 摘要:互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流…...
Android 11.0 长按按键切换SIM卡默认移动数据
Android 11.0 长按按键切换SIM卡默认移动数据 近来收到客户需求想要通过长按按键实现切换SIM卡默认移动数据的功能,该功能主要通过长按按键发送广播来实现,具体修改参照如下: 首先创建广播,具体修改参照如下: /vend…...
Kafka集群调优+能力探底
一、前言 我们需要对4个规格的kafka能力进行探底,即其可以承载的最大吞吐;4个规格对应的单节点的配置如下: 标准版: 2C4G 铂金版: 4C8G 专业版: 8C16G 企业版: 16C32G 另外,一般…...
netcore swagger 错误 Failed to load API definition
后端接口报错如下: 前端nswag报错如下: 根据网上查询到的资料说明,说一般swagger这种错误都是控制器里有接口代码异常造成的,通常是接口没有加属性Attribute, 比如[HttpPost("Delete")]、[HttpGet("Del…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
