2013-02-21 5 views
0

Наше приложение представляет собой приложение Java/Spring3/Spring MVC/Hibernate.Как перехватить запрос для определенного типа файла?

У нас есть ресурсы, которые хранятся в разных местах на серверной машине. Места хранятся в базе данных. В основном, когда веб-приложение запрашивает файл с 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> 

Первый перехват предназначен для нашей аутентификации и отлично работает. В основном убедитесь, что пользователь зарегистрирован для ЛЮБОГО запроса.

Второй перехватчик - это то, что мы установили, чтобы попробовать и перехватить запросы к файлам KML с помощью geoXML3. Кажется, что перехватчик не стреляет? (т. е. KmlInterceptor.preHandle не называется?).

Делаем ли мы правильное отображение там?

Это способ перехватить запросы для определенных типов файлов и вернуть фактический файл, извлеченный из другого места?

+0

Является ли путь к файлам '/ pages/something.kml' или есть дополнительные подкаталоги? Если да, возможно, попытка с '/ page/**/*. Kml' будет делать. –

+0

Ну что ж, в файле /page/something.kml нет файла. Мы хотим поймать запрос на этот uri, найти файл в другом месте и вернуть его в ответ. т.е. никогда не позволяйте веб-приложению искать файл на /page/something.kml –

+0

Да, я это понял. Я спрашивал, потому что выражение может быть неправильным, если поддельный документ был на '/ pages/adirectory/file.kml' –

ответ

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"); 
    } 
}