JavaWeb实验 验证码和文件上传下载

实验目的

  1. 掌握项目中验证码的实现;
  2. 掌握文件上传和下载功能的实现。

实验内容

创建一个Java W eb 应用,具有Xc ode.java 的S ervlet ,另外 : u pload.jsp 和do wnload . jsp 两个页面:

  1. Xcode.j ava Servlet 中,生成验证码,并在 view.jsp 页面显示验证码的图片,通过s ession 保存验证码的答案;
  2. 在u pload.jsp 页面中(对应提交的Se rvlet 为U ploadServlet.java ),上传用户选择的文件至服务器端;
  3. 在d ownload . jsp 页面中(对应提交的Se rvlet 为D ownloadServlet.java ),显示(1)产生的验证码,用户输入正确验证码答案后点击下载链接,能够下载( 2 )中上传的页面。

界面如图:

java 复制代码
Xcode.Java
package gdpu.com;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Xcode extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		int width = 150;
		int height = 40;
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();

		g.setColor(Color.GRAY); 
		g.fillRect(0, 0, width, height);
		g.setColor(Color.white);
		g.setFont(new Font("SimSum", Font.PLAIN,30));
		
		int code=(int)(Math.random()*10000);
		g.drawString(""+code, 10,28);
      
		req.getSession().setAttribute("randStr", ""+code);
		Random rnd=new Random();
		for (int i = 0; i < 100; i++) {
			int rx=rnd.nextInt(255);
			int gx=rnd.nextInt(255);
			int bx=rnd.nextInt(255);;
			
			g.setColor(new Color(rx,gx,bx));
			int x = rnd.nextInt(width);
			int y = rnd.nextInt(height);
			g.drawOval(x, y, 1, 1);
		}
		ImageIO.write(image, "JPG", resp.getOutputStream());
	    
		resp.getOutputStream().close();
	}

}
java 复制代码
Updownload.java

package gdpu.com;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

public class UploadServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		SmartUpload su = new SmartUpload();
		ServletConfig sc = this.getServletConfig();
		su.initialize(sc, req, resp);

		try {
			su.upload();
			File file = su.getFiles().getFile(0);
	 //注意:文件路径需要根据实际环境修改
			String filename=file.getFileName();
			String filename_new=new String(filename.getBytes("GBK"),"UTF-8");
			file.saveAs("C:\\Users\\黄培滇\\Desktop\\JavaWeb\\"+ filename_new, su.SAVE_PHYSICAL);

		} catch (SmartUploadException e) {
			e.printStackTrace();
		}

		System.out.println("上传成功");
		resp.getWriter().print("success");

	}

}
java 复制代码
Download.java
package gdpu.com;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Response;

public class DownloadServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String str = (String) req.getSession().getAttribute("randStr");
		System.out.println("randSt=r" + str);
		String rndx = req.getParameter("randStr");
		System.out.println("rndx=" + rndx);
		// 判断验证码功能,留给同学思考补充完成
		if (rndx != null && rndx.equals(str)) {
			// 1.获得请求文件名
			String fileName = req.getParameter("fileName");
			// 2.设置文件MIME类型(指定要返回内容的类型)
			resp.setContentType(getServletContext().getMimeType(fileName));
			// 3.设置Content-Disposition(指定下载该文件时的文件名)
			resp.setHeader("content-disposition", "attachment;filename=" + fileName);
			// 4.读取目标文件,通过response将目标文件写到客户端
			// 4.1 获取目标文件的绝对路径
			String filePath = "C:\\Users\\黄培滇\\Desktop\\JavaWeb\\" + fileName; // 注意文件路径需要根据实际环境修改
			// 4.2 读取文件
			InputStream in = new FileInputStream(filePath);
			// 4.3 输出文件
			OutputStream out = resp.getOutputStream();
			// 写文件
			int n;
			while ((n = in.read()) != -1) {
				out.write(n);
			}

			in.close();
			out.close();
		} else {
			resp.getWriter().append("Verification code error !");
		}

	}

}
java 复制代码
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>JavaWeb</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>gdpu.com.Login</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login.html</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>translate</servlet-name>
    <servlet-class>gdpu.com.Trans</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>translate</servlet-name>
    <url-pattern>/translate.html</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Xcode</servlet-name>
    <servlet-class>gdpu.com.Xcode</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Xcode</servlet-name>
    <url-pattern>/Xcode.html</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Upload</servlet-name>
    <servlet-class>gdpu.com.UploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Upload</servlet-name>
    <url-pattern>/Upload.html</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>Downloadx</servlet-name>
    <servlet-class>gdpu.com.DownloadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Downloadx</servlet-name>
    <url-pattern>/Download.html</url-pattern>
  </servlet-mapping>
</web-app>
html 复制代码
Upload.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
	    <form action="Upload.html" enctype="multipart/form-data" method="post">
	    		<input type="file" name="myFile">
	    		<input type="submit" value="上传" style="width:100px;">
	    </form>

</body>
</html>
html 复制代码
Download.jsp

<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
      <img src="./Xcode.html" />
      <form method="Get"  action="Download.html">
                    文件名:
      				<input type="text" name="fileName"><br>
                   验证码:<input type="text" name="randStr"><br>
                   <input type="submit" value="下载"/>
      </form>
</body>
</html>
html 复制代码
部分参考代码:
download.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
      <img src="./Xcode.html" />
      <form method="Get"  action="Download.html">
                    文件名:
      				<input type="text" name="fileName"><br>
                   验证码:<input type="text" name="randStr"><br>
                   <input type="submit" value="下载"/>
      </form>
</body>
</html>
Xcode.java

package com.gdpu;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Xcode extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		int width = 150;
		int height = 40;
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();

		g.setColor(Color.red); 
		g.fillRect(0, 0, width, height);
		g.setColor(Color.white);
		g.setFont(new Font("SimSum", Font.PLAIN,30));
		
		int code=(int)(Math.random()*10000);
		g.drawString(""+code, 10,28);
      
		req.getSession().setAttribute("randStr", ""+code);
		Random rnd=new Random();
		for (int i = 0; i < 100; i++) {
			int rx=rnd.nextInt(255);
			int gx=rnd.nextInt(255);
			int bx=rnd.nextInt(255);
			g.setColor(new Color(rx,gx,bx));
			int x = rnd.nextInt(width);
			int y = rnd.nextInt(height);
			g.drawOval(x, y, 1, 1);
		}
		ImageIO.write(image, "JPG", resp.getOutputStream());
	    
		resp.getOutputStream().close();
	}

}
upload.jsp
<%@ page language="java" import="java.lang.*,java.util.*,java.util.Date"
	contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Download/Upload demo</title>
</head>
<body>
	    <form action="Upload.html" enctype="multipart/form-data" method="post">
	    		<input type="file" name="myFile">
	    		<input type="submit" value="上传" style="width:100px;">
	    </form>

</body>
</html>

DownloadServlet.java
 

package com.gdpu;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String str = (String) req.getSession().getAttribute("randStr");
		System.out.println("randSt=r" + str);
		String rndx = req.getParameter("rndx");
		System.out.println("rndx=" + rndx);
		// 判断验证码功能,留给同学思考补充完成

		// 1.获得请求文件名
		String fileName = req.getParameter("fileName");
		// 2.设置文件MIME类型(指定要返回内容的类型)
		resp.setContentType(getServletContext().getMimeType(fileName));
		// 3.设置Content-Disposition(指定下载该文件时的文件名)
		resp.setHeader("content-disposition", "attachment;filename=" + fileName);
		// 4.读取目标文件,通过response将目标文件写到客户端
		// 4.1 获取目标文件的绝对路径
		String filePath = "d: /"+ fileName;   //注意文件路径需要根据实际环境修改
		// 4.2 读取文件
		InputStream in = new FileInputStream(filePath);
		// 4.3 输出文件
		OutputStream out = resp.getOutputStream();
		// 写文件
		int n;
		while ((n = in.read()) != -1) {
			out.write(n);
		}

		in.close();
		out.close();

	}

}



UploadServlet.java
 
package com.gdpu;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jspsmart.upload.File;
import com.jspsmart.upload.SmartUpload;
import com.jspsmart.upload.SmartUploadException;

public class UploadServlet extends HttpServlet {

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		SmartUpload su = new SmartUpload();
		ServletConfig sc = this.getServletConfig();
		su.initialize(sc, req, resp);

		try {
			su.upload();
			File file = su.getFiles().getFile(0);
	 //注意:文件路径需要根据实际环境修改
			file.saveAs("d:/"+ file.getFileName(), su.SAVE_PHYSICAL);

		} catch (SmartUploadException e) {
			e.printStackTrace();
		}

		System.out.println("上传成功");
		resp.getWriter().print("success");

	}

}

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>vx</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.jsp</welcome-file>
		<welcome-file>default.htm</welcome-file>
	</welcome-file-list>
     <servlet>
		<servlet-name>Xcode</servlet-name>
		<servlet-class>com.gdpu.Xcode</servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>Xcode</servlet-name>
         <url-pattern>/Xcode.html</url-pattern>
     </servlet-mapping>
     
     
      <servlet>
		<servlet-name>Upload</servlet-name>
		<servlet-class>com.gdpu.UploadServlet</servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>Upload</servlet-name>
         <url-pattern>/Upload.html</url-pattern>
     </servlet-mapping>
     
     
           <servlet>
		<servlet-name>Downloadx</servlet-name>
		<servlet-class>com.gdpu.DownloadServlet</servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>Downloadx</servlet-name>
         <url-pattern>/Download.html</url-pattern>
     </servlet-mapping>
</web-app>
相关推荐
涛々1 分钟前
uniapp-vue3-js-vite-pinia-eslint 快速开发模板
javascript·uni-app·uniapp+vue3模板
解道Jdon11 分钟前
最新苹果液体玻璃Liquid Glass效果CSS实现
javascript·reactjs
啊~哈31 分钟前
页面弹窗适配问题
前端·javascript·vue.js
用户3273242098741 分钟前
logger2js - JavaScript日志与调试工具库
javascript
安然dn1 小时前
Interact.js 一个轻量级拖拽库
javascript
FogLetter1 小时前
从"乱炖"到"法式大餐":Promise如何优雅地管理异步流程
前端·javascript
williamdsy1 小时前
【Vue PDF】Vue PDF 组件初始不加载 pdfUrl 问题分析与修复
前端·javascript·vue.js·pdf
我不吃饼干2 小时前
我给掘金写了一个给用户加标签的功能
前端·javascript·cursor
步行cgn3 小时前
Vue 事件修饰符详解
前端·javascript·vue.js
vvilkim3 小时前
Flutter 状态管理基础:深入理解 setState 和 InheritedWidget
前端·javascript·flutter