使用Filter处理静态资源,比如flash文件等
程序员文章站
2022-07-12 11:55:55
...
一个help.html网页,有对swf的文件的引用。
因为某些原因,这些swf文件并不放在web application context下面,而是放在服务器上的某个路径下。现在需要让
<param name="src" value="howto/help.swf"/>可用,可以采用Servlet Filter拦截,然后自己从硬盘读取help.swf文件并写入response,以达到“偷梁换柱”的目的。
采用Servlet Filter实现对SWF静态文件的拦截,从而可以自己定制,你可以可以采用任何你可以取到资源的方式来做操作,并将读取到的东西写到response中去。
下面是一个简单的从文件读取内容的Filter
当然了,必须在web.xml中才能起作用
配置的片段:
主体部分完成,使用浏览器进行测试的时候一定要注意。因为浏览器会缓存一些静态资源,所以每次测试的时候最好都将浏览器缓存清空,要不浏览器不发起对资源<param name="src" value="howto/help.swf"/>的请求,拦截也就无从谈起。
代码中的例子只是很基本的工作的例子。
-------
写下这个,主要是想抛砖引玉,大家碰到类似情况都是怎么处理的?
<object classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="100" height="50"> <param name="BorderStyle" value="1" /> <param name="MousePointer" value="0" /> <param name="Enabled" value="1" /> <param name="Min" value="0" /> <param name="Max" value="10"/> <param name="src" value="howto/help.swf"/> </object>
因为某些原因,这些swf文件并不放在web application context下面,而是放在服务器上的某个路径下。现在需要让
<param name="src" value="howto/help.swf"/>可用,可以采用Servlet Filter拦截,然后自己从硬盘读取help.swf文件并写入response,以达到“偷梁换柱”的目的。
采用Servlet Filter实现对SWF静态文件的拦截,从而可以自己定制,你可以可以采用任何你可以取到资源的方式来做操作,并将读取到的东西写到response中去。
下面是一个简单的从文件读取内容的Filter
package com.sean.filter; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class StaticResourceFilter implements Filter { private static final String RESOURCE_BAST_PATH = "resourceBastPath"; private String basePath; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (request instanceof HttpServletRequest) { HttpServletRequest req = (HttpServletRequest) request; String uri = req.getRequestURI(); // find howto/xxx.swf request Pattern pattern = Pattern.compile("(howto/.+\\.swf$)"); Matcher matcher = pattern.matcher(uri); if (matcher.find()) { String path = matcher.group(0); // Read data from disk and transmit to response. InputStream is = new FileInputStream(getBasePath() + "/" + path); int iValue = -1; while ((iValue = is.read()) != -1) { response.getOutputStream().write(iValue); } response.getOutputStream().flush(); return; } } chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { setBasePath(filterConfig.getInitParameter(RESOURCE_BAST_PATH)); } public String getBasePath() { return basePath; } public void setBasePath(String basePath) { this.basePath = basePath; } }
当然了,必须在web.xml中才能起作用
配置的片段:
<!-- Filter to deal with request for swf resources --> <filter> <filter-name>resourceFilter</filter-name> <filter-class>com.sean.filter.StaticResourceFilter</filter-class> <init-param> <param-name>resourceBastPath</param-name> <param-value>/var/www/xxapp/resource/flash</param-value> </init-param> </filter> <filter-mapping> <filter-name>resourceFilter</filter-name> <!-- Filter all request --> <url-pattern>/*</url-pattern> </filter-mapping>
主体部分完成,使用浏览器进行测试的时候一定要注意。因为浏览器会缓存一些静态资源,所以每次测试的时候最好都将浏览器缓存清空,要不浏览器不发起对资源<param name="src" value="howto/help.swf"/>的请求,拦截也就无从谈起。
代码中的例子只是很基本的工作的例子。
-------
写下这个,主要是想抛砖引玉,大家碰到类似情况都是怎么处理的?
下一篇: Maven初学