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…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
针对药品仓库的效期管理问题,如何利用WMS系统“破局”
案例: 某医药分销企业,主要经营各类药品的批发与零售。由于药品的特殊性,效期管理至关重要,但该企业一直面临效期问题的困扰。在未使用WMS系统之前,其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...
STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
