2016-08-17 2 views
0

내 스프링 컨트롤러는 /resources/*으로 시작하는 URI를 제외한 모든 URI 유형의 get 요청을 받아 들여야합니다. 잘못된 것이 아니기 때문에 스프링 컨테이너에서 뷰 페이지의 모든 정적 콘텐츠를로드해야합니다.Spring RequestMapping에서 특정 URI 패턴을 무시하는 방법은 무엇입니까?

현재 구성은 URI / 또는 /example와 요청에 대해 잘 작동이

@RequestMapping(method = RequestMethod.GET, value="/*") 

비슷하지만 누군가가 URI 예에서 오타를 확인합니다. /example/random/char가 던지고 예외 추적 페이지를 찾을 수 없습니다 꽤 분명하고 value="/**"

@RequestMapping(method = RequestMethod.GET, value="/**") 

/ 또는 /example 내보기 페이지에서 내 정적 콘텐츠를 .js, .css or .png 파일을로드 할 수없는 URI로 요청을하는 날 리드 (404) . 이것은 스프링이 내부적으로 이러한 파일을 URL 패턴과 함께로드하도록 요청한다는 결론에 이르게합니다. http://localhost:8080/resources/my.jpg.

참고 : - 의도적으로 tomcat을 구성하여 프로젝트 이름을 삭제했습니다.

업데이트 좋아요. @ dimitrisli 의견을 통해 제 프로젝트에 대해 좀 더 자세히 설명해야한다는 것을 알게되었습니다.

기본적으로 URL 리디렉션 구성 요소입니다. 사용자는 get request를 통해 내 응용 프로그램을 호출하고 실제 페이지로 리디렉션하면서 끝납니다.

예를 들어 사용자의 브라우저에서 URL을 http://localhost:8080/sample이라고 말하면됩니다. 이제는 내 응용 프로그램에서 URL을 분할하여 문자열 sample을 얻고 db에서 실제 URL을 검색해야합니다 (따라서 sample은 매우 긴 URL의 별칭입니다). URL이 존재하면 실제 페이지로 리디렉션됩니다. 존재하지 않는 페이지가 표시됩니다.

답변

1

(의견에 따라 업데이트)

404 오류를 처리하는 방법입니다.

옵션 web.xml 1

메인 페이지에 전달하기 위해 다음과 같습니다 :

<error-page> 
    <error-code>404</error-code> 
    <location>/</location> 
</error-page> 

또는 사용자 지정 오류 특정 페이지 :

<error-page> 
    <error-code>404</error-code> 
    <location>/my-custom-error-page</location> 
</error-page> 

옵션 2

는 컨트롤러 계층에서 포괄 오류 처리기를 정의 : 당신이 (자원)하고 설명을 제외 할 폴더의 이름을 바탕으로

@ExceptionHandler(Exception.class) 
public String handleAllExceptions(Exception e) { 
    log.error("There was an exception thrown! ", e); 
    return "index"; 
} 

(은 .js/.CSS/.PNG) 나는 당신이 당신의 웹 프로젝트의 정적 인 내용을 언급하고 있다고 가정하고있다.

는 명시 적으로 다음과 같이 dispatcher servlet xml에 정적 내용을 정의 (정적 데이터에 대한 프로젝트의 디렉토리 규칙에 따라)해야 당신이 당신의 프로젝트에 resource handler를 추가 할 필요가 같은

<mvc:resources mapping="/resources/**" location="/resources/" /> 
<mvc:resources mapping="/css/**" location="/resources/css/" /> 
<mvc:resources mapping="/images/**" location="/resources/images/" /> 
<mvc:resources mapping="/js/**" location="/resources/js/" /> 
<mvc:resources mapping="/fonts/**" location="/resources/fonts/" /> 
+0

답변 해 주셔서 감사합니다. 그러나 이것은 내 관심사가 아닙니다. 나는 이미 이것을했다. @Override 공개 무효 addResourceHandlers (ResourceHandlerRegistry 레지스트리) { \t \t registry.addResourceHandler ("/ resources/**"). addResourceLocations ("/ resources /"). } – Satyaprakash

+0

정확히 무엇이 당신의 관심사입니까? 리소스 세부 정보를 정의한 경우 모든 정적 컨텐트가 webapp에서 제공되며 @RequestMapping을 통과하지 않습니다 – dimitrisli

+0

네가 맞습니다 만 value = "/ *"일 때 RequestMapping을 통과하지는 않지만 RequestMapping은 RequestMapping으로 갈 것입니다 value = "/ **" – Satyaprakash

0

그것은 소리. 이렇게하면 /resources 폴더의 파일을 통과시킬 수 있습니다. 참조 용으로 몇 가지 예제 코드가 들어있는 post입니다.

registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");

또 다른 옵션은 컨트롤러 방법에 그것을 만들기 전에 모든 URI를 잡는다 인터셉터를 구현할 수 있습니다. 이렇게하면 단일 컨트롤러 메소드로 모든 것을 수행하는 대신 실제로 컨트롤러에 도달하기 전에 DB에 상황이 존재하는지 확인하기 위해 일부 논리를 추가 할 수 있습니다. HandlerInterceptorAdapter을 확장하면 조사 할 항목이 될 수 있습니다.

+0

"리소스 핸들러"를 구성하는 첫 번째 제안이 이미 있습니다. 그러나 "요격기"에 대한 두 번째 제안은 나에게 매우 의미가있다. 나는 이것을 시도해야한다. 감사. – Satyaprakash

+0

'registry.setOrder (Ordered.HIGHEST_PRECEDENCE);'를 추가하여 우선 순위가 가장 높은지 확인하십시오. – itsthejash

+0

'registry.setOrder (Ordered.HIGHEST_PRECEDENCE);'나를 위해 작동하지 않았다. 이것은 여러 리소스를 처리 할 때 유용 할 것입니다. – Satyaprakash

관련 문제