2013-02-21 2 views
0

우리의 응용 프로그램은 Java/Spring3/Spring MVC/Hibernate 기반 응용 프로그램입니다.특정 파일 형식에 대한 요청을 차단하는 방법은 무엇입니까?

우리는 서버 컴퓨터의 여러 위치에 저장되는 리소스가 있습니다. 위치는 데이터베이스에 저장됩니다. 기본적으로 웹 애플리케이션이 /<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

파일'/ 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"); 
    } 
}