2009-12-28 3 views
0

내가 해결하려고하는 문제는 데이터베이스에 대해 들어오는 GET URL을 모두 확인하려고한다는 것입니다. url이 데이터베이스에 존재한다면 그것은 certein 컨트롤러로 전달되어야한다. 저는 Spring 3.0을 사용하고 있습니다.HandlerMapping 전에 HttpServletRequest를 수정 하시겠습니까?

먼저 interceptor을 만들어 DefaultAnnotationsHandlerMapping에 추가하려고했습니다. 내가 preHandle()에서 url을 수정할 수 없다는 것이 드러났습니다. 계획에서 요청의 URL을 수정 한 다음 주석 처리 된 컨트롤러가 나머지를 처리하도록했습니다.

다음 사용자 지정 HandleMapping을 만들려고했습니다. 나는 AbstractUrlHandlerMapping을 확장하고 Controller의 이름을 가진 String을 반환하는 내 자신의 getHandlerInternal()을 만들었고 이것이 작동 중이다. 하지만 요청 URL을 수정하고 주석 처리 된 컨트롤러에서 처리하도록하는 솔루션을 선호합니다.

이 글을 쓰는 동안 서블릿 필터가 가장 적절한 해결책 일 것이라고 생각했습니다. 그렇다면 Spring에서 EntityManager를 필터에 삽입 할 수 있습니까? Spring 클래스를 확장하면 더 쉽게 사용할 수 있습니다.

첫 번째 단락에서 문제를 해결하는 가장 적절한 방법은 무엇입니까? 서블릿 필터 인 경우 작성 방법에 대한 몇 가지 지침을 알려주십시오.

답변

0

다른 사람들에 의해 지적 되었 듯이 표준 서블릿 필터는 작업을 수행하지만 스프링 친화적 인 해결책은 아닙니다. 필터는 Spring에서 관리하지 않으므로 스프링 빈과 연결할 수 없습니다. 필터는 스프링 빈을 프로그래밍 방식으로 가져와야하는데, 좋지 않습니다.

기존 요청의 URL을 수정하면 서블릿 API 모델이 손상된다는 문제가 있습니다. HttpServletRequest에는 원본 URL의 다른 부분을 추출하는 경로 및 URL 관련 메서드가 여러 개 있습니다. 이러한 모든 값을 어떻게 든 수정했는지 확인해야합니다. API는 필터 또는 인터셉터를 사용하든 관계없이이를 위해 설계되지 않았습니다.

API를 파괴하려고하는 것이 아니라, "old"경로를 허용하고 삽입 된 EntityManager을 기반으로 "new"경로로 요청을 전달하는 Spring 컨트롤러를 작성하는 것이 좋습니다. 전달은 컨트롤러 처리기 메서드가 "new"경로를 사용하여 InternalResourceView을 반환하도록함으로써 발생할 수 있습니다. 엄밀히 말하면 전달할보기는 아니지만 Spring은 그 차이를 알 수 없습니다. 또는 request.getRequestDispatcher(newPath).forward(request, response)을 사용하여 직접 전달할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 간단한'RequestMapping (value = "/ *")이 필요한 것 같습니다. –

0

보통 javax.servlet.Filter을 사용하고 URL 처리를 수행하는 HttpServletRequest -Wrapper를 만들 수 있습니다.

0

서블릿 요청을 랩핑하여 필터 체인에 전달할 수 있습니다.

... 
MyHttpServletRequestWrapper wreq = new MyHttpServletRequestWrapper(request); 
doFilter(wreq, response, chain); 
... 

요청시 래퍼는 수정 된 URL을 반환합니다.

0

나는이 오래된 스레드 실현, 대신 나는이 같은 org.springframework.web.servlet.DispatcherServlet에게 뭔가를 확장 할 것을 제안 :

@Override 
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    try { 
     RequestImpl req = RequestImpl.wrapRequest(request, response); 
     request = req; 
     response = req.getResponse(); 
    } catch (Throwable t) { 
     //swallow  } 
    super.doDispatch(request, response); 
} 

그런 다음 웹이 디스패처를 참조하십시오. xml 형식 :

기타Spring MVC의 핵심 핵심 클래스를 확장하는 것은 무서운 것처럼 보이지만, 주석을 다룬 어두운 날 이전에, 실제 성인이 우리 모두가 사랑했던 아름다운 POJO 프레임 워크를 사용하고있을 때, 봄을 사용하기 위해 다시.

관련 문제