0

我们的应用程序是基于 Java/Spring3/Spring MVC/Hibernate 的应用程序。

我们有一些资源存储在服务器机器上的不同位置。位置存储在数据库中。基本上,当 Web 应用程序从 uri 请求文件/<our-app>/page/file.kml时,例如需要拦截此调用时,忽略请求的 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 没有被调用?)。

我们在那里做正确的映射吗?

这是拦截特定文件类型的请求并返回从其他地方检索到的实际文件的方法吗?

4

1 回答 1

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");
    }
}
于 2013-02-28T17:34:45.873 回答