2011-07-26 3 views
1

다국어 URL 주소를 갖기 위해 커스텀 핸들러 인터셉터를 쓰고 있습니다. 예를 들어 사용자가 uri /de/auto에 액세스하면 deutsch 콘텐츠가 표시되고 사용자가 /en/car에 액세스하면 영어 콘텐츠가 표시됩니다.Spring 3 HandlerInterceptorAdapter. 요청은 404로 끝나기 전에 요격합니다.

@Controller 
public class MultiLangController { 

    @RequestMapping(value="/en/car", method = RequestMethod.GET) 
    public @ResponseBody String writePage() { 

     return "some content"; 
    } 

내 인터셉터이 (간체 버전)과 같이 구현됩니다 : : 이제

public class MultiLangInterceptor extends HandlerInterceptorAdapter { 

    @Override 
    public boolean preHandle(HttpServletRequest request, 
    HttpServletResponse response, Object handler) throws Exception { 

     String requestUrl = request.getRequestURI().substring(request.getContextPath().length()); 

     if ("/de/auto".equals(requestUrl)) { 
      String redirect = request.getContextPath() + "/en/car"; 

      response.sendRedirect(redirect); 
      return false; 
     } 
     return true;   
    } 
} 

내가 브라우저에서 /en/car URL을 액세스 할 때, 올바른 페이지가 둘 다 요청이 동일한 컨트롤러와 동일한 방법으로 재 지정하려면 리턴 된 ("some content"라는 메시지와 함께) 그리고 로그는 그 인터셉터를 통해 전달 된 요청을 보여줍니다. /de/auto에 액세스하면 404 오류가 반환되고 요청에 따라 요청이 인터셉터로 전달되지 않습니다. 하지만 왜? 그들 중 하나가 거짓을 돌려서 중지시킬 때까지 모든 인터셉터를 통과하도록 요청해서는 안됩니까?

은 명확하게하기 위해 hidding my custom interceptor이므로 사용하지 않았습니다. 모두 수동으로 정의했습니다.

<bean id="handlerMapping" 
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <ref bean="multiLangInterceptor" /> 
    </property> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jacksonMessageConverter"/> 
      <ref bean="stringHttpMessageConverter"/> 
     </list> 
    </property> 
</bean> 

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> 

<bean id="multiLangInterceptor" class="example.MultiLangInterceptor" />  

<bean id="stringHttpMessageConverter" 
    class="org.springframework.http.converter.StringHttpMessageConverter"/> 

답변 해 주셔서 감사합니다!

답변

5

맵핑이 있는지를 결정하기 전에 모든 수신 요청을 인터셉터로 보낼 수는 없습니다. 인터셉터에 대한 인수 중 하나가 컨트롤러 자체임을 주목하십시오! 들어오는 URL이 어디에도 매핑되지 않은 경우, 메소드 인수로 전달할 처리기를 어떻게 알 수 있습니까? 요청이 디스패처 서블릿에 도달하기 전에 URL 재 작성을 스택 위로 수행해야합니다. E.G., servlet filter for that purpose.

또 다른 가능한 옵션은 충돌 것 같은 디스패처에서/일/자동차의 다른 매핑을하지 않는 한이 방법으로 당신의 컨트롤러

@RequestMapping(value="/{languageCode}/car", method = RequestMethod.GET) 

를 매핑하는 것이다.

관련 문제