【问题标题】:Printing HTML file using JSP on new page在新页面上使用 JSP 打印 HTML 文件
【发布时间】:2012-12-27 10:41:54
【问题描述】:

我实际上是在使用此代码从服务器上的“不可用”文件夹中打印 JSP 中的 HTML 文件(我的意思是,如果我正在编写文件的正确 URL,我将无法查看它们在我的浏览器上):

InputStreamReader isr = new InputStreamReader(new FileInputStream(request.getParameter("path")));
BufferedReader br = new BufferedReader(isr);    
String line = br.readLine();
while(line!=null){
    out.println(line);
    line = br.readLine();
}

在“路径”中有我的文件的 URL。这确实有效,但它在我启动这段代码的同一页面中显示了我的 HTML 文件。我实际上需要在 新页面 上执行此操作,例如当您以这种方式设置此 HTML A 标记时:

<a href="www.mywebsite.com" TARGET="_new">LINK</a>

【问题讨论】:

  • 你为什么要阅读和写作?你为什么不使用请求调度器转发它......像这样...... .RequestDispatcher rd = getServletContext().getRequestDispatcher(destination); rd.forward(请求,响应);

标签: java html jsp url servlets


【解决方案1】:

我是这样解决的:

<a href="www.mywebsite.com/print?id=1&file=myfile.html" TARGET="_new">View</a>

在 servlet 打印中,我将此代码放入由 doGet/doPost 调用的 processRequest(HttpServletRequest request, HttpServletResponse response) 中:

String path1 = "mydir1/";
String path2 = "mydir2/";
String file = request.getParameter("file");    
InputStreamReader isr;
BufferedReader br;
String line = "";
char id = request.getParameter("id").charAt(0);
if(id == '1') {
    isr = new InputStreamReader(new FileInputStream(mydir1 + file));
    br = new BufferedReader(isr);
    line = br.readLine();
    while(line!=null){
        out.println(line);
        line = br.readLine();
    }
}
else if(id == '2') {
    isr = new InputStreamReader(new FileInputStream(mydir2 + file));
    br = new BufferedReader(isr);
    line = br.readLine();
    while(line!=null){
        out.println(line);
        line = br.readLine();
    }
}
else {
    out.println("Error");
}

这样就没有更多的安全问题,因为最终用户/黑客无法查看整个路径,或者通过 get 方法传递它。

【讨论】:

  • -1 表示主要安全漏洞。这种方法允许最终用户/黑客通过将请求参数值编辑为例如,从磁盘文件系统获取每个文件以显示在网页上。 /Users/Administrator/passwords.txt,包括那些不打算公开访问的,例如web.xml、用户文档、操作系统文件等。
  • 使用新解决方案编辑。
  • 还是可以通过../../../../some.ext。根本不要使用FileInputStream。将它放在类路径或 webcontent 上并从那里获取。或者,根据问题中根本不清楚的功能要求,您也可以拨打forward() 电话。
  • 如您所知,我的文件不在也不能在 classpath/webcontent 文件夹中,它们位于 webapp 文件夹之外。我已经尝试过使用forward() 函数,但它当然没有用。如果最终用户在 servlet 上,他们如何看到其他路径?客户端看不到他们的路径,只能看到文件名(已显示在列表中)。无论如何,此网络应用程序仅供内部使用。
  • 将 servlet 映射到 /print/* 并通过 /print/myfile.html?id=1 打开它。您可以通过request.getPathInfo() 获取文件部分。这样,任何../ 导航都只会影响请求 URL(并以 404 结尾),而不影响文件路径。
猜你喜欢
  • 1970-01-01
  • 2013-04-12
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多