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>
相关推荐
小爱丨同学33 分钟前
宏队列和微队列
前端·javascript
沉登c1 小时前
Javascript客户端时间与服务器时间
服务器·javascript
持久的棒棒君1 小时前
ElementUI 2.x 输入框回车后在调用接口进行远程搜索功能
前端·javascript·elementui
小程xy4 小时前
react 知识点汇总(非常全面)
前端·javascript·react.js
非著名架构师5 小时前
js混淆的方式方法
开发语言·javascript·ecmascript
多多米10056 小时前
初学Vue(2)
前端·javascript·vue.js
敏编程6 小时前
网页前端开发之Javascript入门篇(5/9):函数
开发语言·javascript
看到请催我学习6 小时前
内存缓存和硬盘缓存
开发语言·前端·javascript·vue.js·缓存·ecmascript
XiaoYu20028 小时前
22.JS高级-ES6之Symbol类型与Set、Map数据结构
前端·javascript·代码规范
儒雅的烤地瓜8 小时前
JS | JS中判断数组的6种方法,你知道几个?
javascript·instanceof·判断数组·数组方法·isarray·isprototypeof