Originariamente inviato da eziolink88
sai dove posso trovare del codice d'esempio?
Ecco un esempio:
codice:
package tuopackage;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadFilter implements Filter {
public void init(FilterConfig filterConfig)
throws ServletException {}
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (request.getParameter("download") != null) {
response = new DownloadResponseWrapper((HttpServletResponse) response);
}
chain.doFilter(request, response);
}
private static class DownloadResponseWrapper extends HttpServletResponseWrapper {
public DownloadResponseWrapper(HttpServletResponse response) {
super(response);
super.setContentType("application/octet-stream");
}
public void setContentType(String type) {}
}
}
Nota che non basterebbe invocare response.setContentType("application/octet-stream"); e poi banalmente passare subito questa response al filter chain. Perché poi la "risorsa" nel server che gestisce l'invio di file statici comunque cambierebbe il content type secondo la mappatura standard.
Facendo come sopra invece viene creato un wrapper della response in cui setContentType() non ha più effetto perché vuoto.
Nel DD (web.xml) puoi mappare così:
codice:
<filter>
<filter-name>DownloadFilter</filter-name>
<filter-class>tuopackage.DownloadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DownloadFilter</filter-name>
<url-pattern>*.txt</url-pattern>
</filter-mapping>
Il filtro viene quindi eseguito ad ogni richiesta di file .txt ma solo se c'è ?download come query causa il download forzato.