本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
输入密码显示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跳转。