JavaEE实现输入密码显示PDF

62 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

输入密码显示PDF。

内容说明

编程实现如下功能: 编写页面1,提示输入密码取得pdf文件,并提供form组件和密码输入框。提交密码后由servlet1处理请求:

  • 若密码正确,则重定向到servlet2,servlet2发送一个pdf文件给浏览器。
  • 如果密码输入错误,则直接返回响应,提示“密码错误,请重新输入”。

代码

Servlet 2

首先我们编写pdf内容展示界面:

@WebServlet(name="PDFServlet",urlPatterns={"/pdfshow"})
public class Servlet2 extends HttpServlet {
        //...
	protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
		response.setContentType("application/pdf");
		ServletOutputStream out=response.getOutputStream();
		File pdf=null;
		byte[] buffer=new byte[1024*1024];
		FileInputStream input=null;
		try {
			pdf=new File("D:\\一键关机\\[数论导引].华罗庚.清晰版.pdf");
			response.setContentLength((int) pdf.length());
			input=new FileInputStream(pdf);
			int readBytes=-1;
			while ((readBytes=input.read(buffer,0,1024*1024))!=-1) {
				out.write(buffer,0,1024*1024);
			}
		} catch (IOException e) {
			System.out.println("file not found!");
		} finally {
			if (out!=null) {
				out.close();
			}
			if (input!=null) {
				input.close();
			}
		}
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}
        //...

}

接下来我们对程序进行说明:首先调用HttpServletResponse接口的response.setContentType("application/pdf")方法将响应内容类型设置为PDF格式,然后调用getOutputStream()获取Servlet输出流对象。为使PDF以流的形式输出到客户端,先创建一个File对象,根据 File 对象得到一个文件输入流对象。通过将文件输入流中的信息写到Servlet输出流中实现 PDF 文件的发送。

为了防止下载的数据量过大,代码中使用了一个容量为1MB的缓冲区,为运行该程序,需要将文件地址改为本机内PDF文件的相应地址。

Html和Servlet 1

首先我们编写page1.html,它仅包含一个表单,将数据以POST请求方法提交给Servlet1。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>输入密码显示PDF</title>
</head>
<body>
	<form action="Servlet1" method="post">
		输入密码以获取PDF内容:<input type="password" name="password"/>
		<input type="submit"name="Submit2" value="提交"/>
	</form>
</body>
</html>

然后是Servlet1:

  • 如果请求为GET,转到page1.html。
  • 如果请求为POST,对表单提交的数据进行判断:如果密码和我们设置的值一样,就转到Servlet2,展示PDF的内容。否则显示密码错误。
@WebServlet(name="SubmitPassword",urlPatterns= {"/SubmitPassword"})
public class Servlet1 extends HttpServlet {
	//...
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.getRequestDispatcher("page1.html").forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String s=request.getParameter("password");
		
		if (s.equals("123456")) {
			HttpSession session = request.getSession(true);
			session.setAttribute("flag", 1);
			response.sendRedirect("pdfshow");
		}
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out=response.getWriter();
		try {
			out.println("密码错误,请重新输入");
		} finally {
			out.close();
		}
	}

}

其他

为了避免用户绕过输入密码环节直接访问Servlet2,我们可以使用HttpSession记录用户输入密码的状态,使用请求转发进行url跳转。