我们的应用程序是基于Java / Spring3 / Spring MVC / Hibernate的应用程序。
我们有一些资源存储在服务器计算机上的各个不同位置。位置存储在数据库中。基本上,当Web应用程序在需要拦截此调用时从类似/<our-app>/page/file.kml
的uri请求文件时,忽略请求的uri,查找文件的实际位置并将其作为响应返回。
在我们的servlet-context.xml
中,我们有一些拦截器;
<interceptors>
<interceptor>
<mapping path="/page/**" />
<beans:bean class="com.ourapp.AuthenticationInterceptor" />
</interceptor>
<interceptor>
<mapping path="/page/*.kml" />
<beans:bean class="com.ourapp.KmlInterceptor" />
</interceptor>
</interceptors>
第一个拦截是我们的身份验证,效果很好。基本上确保用户登录以获取任何请求。
第二个拦截器是我们设置的尝试拦截来自geoXML3的KML文件的请求。拦截器似乎没有开火? (即不调用KmlInterceptor.preHandle?)。
我们在那里做正确的映射吗?
这是拦截特定文件类型请求并返回从其他地方检索的实际文件的方法吗?
答案 0 :(得分:0)
实际上,我们已经不再试图使用拦截器而只是使用普通的@RequestMapping
注释;
@RequestMapping(value = "/page/location/*.kml", method = RequestMethod.GET)
public void getKMLFile(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
try {
// Getting the filename (ie splitting off the /page/location/ part)
String uri = httpRequest.getRequestURI();
String[] parts = uri.split("/");
String alais = parts[parts.length - 1];
// Our app specific code finding the file from the db location
Resource resource = resourceService.getResourceByAlias(alais);
File file = resource.getAbsFile();
// Putting the file onto the httpResponse
InputStream is = new FileInputStream(file);
IOUtils.copy(is, httpResponse.getOutputStream());
httpResponse.flushBuffer();
} catch (IOException e) {
throw new RuntimeException("IOError writing file to output stream");
}
}