【问题标题】:How to protect pdf file with Tomcat filters?如何使用 Tomcat 过滤器保护 pdf 文件?
【发布时间】:2011-09-03 08:40:36
【问题描述】:

嗨,

我目前正在运行一个带有 struts 1 的 tomcat 实例,我希望 tomcat 检测何时在 URL 中请求 pdf 文件(例如链接:http://www.***.com/files/action=download&name=myreport.pdf)。

此时我希望实例化一个 java 类,然后使用 pdf API 向文件注入密码。这里的要点是我不想将密码存储在我提供的原始 pdf 文件中,而是希望 Tomcat 在运行时注入密码。

如果您有任何想法,请告诉我,我做了一些研究,发现了 tomcat 过滤器,但我不确定这是否能解决这个问题。

请注意密码存储在数据库表中。

谢谢

【问题讨论】:

  • 你是说你保存了 PDF 的密码保护?或者您希望用户在访问 pdf 之前输入密码?

标签: java tomcat passwords servlet-filters protection


【解决方案1】:

从过滤器中,我们调用一个 Java 类来执行实际的“密码注入”。

web.xml 中的条目会将您的调用重定向到特定过滤器。

<!--web.xml call all calls to .pdf will invoke the particular filter.-->
<filter>
   <filter-name>PDF Filter</filter-name>
   <filter-class>PDFFilter</filter-class>
</filter>
<filter-mapping>
   <filter-name>PDF Filter</filter-name>
   <url-pattern>*.pdf</url-pattern>
</filter-mapping>

//This is the actual filter
public class PDFFilter implements Filter 
{
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException 
    {
        PDFPasswordInjector pdfPassInject = new PDFPasswordInjector();
        //use HttpServletRequestWrapper to get the pdf location/pdf name
        pdfPassInject.injectPassword( "<pdf location>" );

        chain.doFilter(request, response);
    }
}

//Java class to inject the password
public class PDFPasswordInjector
{
    public boolean injectPassword( String sPDFName )
        {
                // retrieve password from DB
                // use API to inject password to PDF
        }
}

【讨论】:

    【解决方案2】:

    过滤器不是解决这个特定问题的方法。过滤器允许您修改请求并导致它们被重定向或重新分派到不同的 servlet。但是它们不允许您重写响应正文。据我了解,这就是你想要做的。

    您必须在 Servlet 中修改 PDF 文件,如@Aardvocate 的回答中所述。

    【讨论】:

      【解决方案3】:

      编写Filter 来拦截所有返回PDF 的请求应该是相当简单的。 Filter 的 doFilter() 方法可以访问请求和响应,因此您可以随意修改它。

      【讨论】:

        【解决方案4】:
        1. 创建一个小服务程序
        2. 将 url-pattern 设置为 *.pdf
        3. 每当调用您的 pdf url 时,都会执行 servlet。
        4. 在将 PDF 返回给用户作为响应之前,从 servlet 执行您想要的任何操作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-14
          • 1970-01-01
          • 2012-09-05
          • 2014-10-26
          • 2017-11-17
          • 2011-02-26
          相关资源
          最近更新 更多