2011-04-11 3 views
2

요청 매개 변수에 대한 변환을 수행하기 위해 서브 클래스 HttpServletRequestWrapper을 사용하고 있습니다. 요청 된 첫 번째 값은 변환 된 값을 캐시합니다. 예를 들어, 처음으로 getQueryString()이 호출되면 super.getQueryString()을 호출하고 원하는 결과를 계산하여 필드에 유지 한 다음 반환합니다. 다음 번에는 캐시 된 결과 만 사용합니다.RequestWrapper 오브젝트에서 요청이 전달되는시기를 알아 보는 방법

"전달"이없는 한이 방법은 매력처럼 작동합니다. 요청이 전달되면 Tomcat이 원래 요청을 바꿔 캐시 된 쿼리 문자열이 변경되지 않고 전달 된 페이지가 전달 된 것이 아닌 원래 쿼리 문자열을 가져옵니다.

캐시를 지우는 데 setRequest() 메서드를 재정의해도 요청이 두 번 래핑 된 것처럼 내 속지에있는 setRequest (내 것이 아닌)을 호출하며 캐시를 지울 수있는 방법이 없습니다. 일어난다.

"전달"이있을 때 캐시를 지울 수 있도록 래핑 된 요청 계층 구조가 변경되었을 때 알림을받을 수있는 방법을 찾고 있습니다.

+1

요청이 처리되기 바로 전에 요청 데이터를 수정 (캐시 값을 처리하고 저장하는) 필터를 사용하지 않는 이유는 무엇입니까? 이것은 당신이 그런 일을해야한다고 생각하는 것보다 더 스펙이 될 것입니다. – HefferWolf

+0

필터에 요청을 래핑하는 중이지만 사양에서 원래 요청 값을 수정하지 말고 요청을 수정해서는 안된다고합니다. 참조하십시오 : http://stackoverflow.com/questions/1413129/modify-request-parameter-with-servlet-filter – Iravanchi

답변

10

원래 요청 URI는 RequestDispatcher.FORWARD_REQUEST_URI 키가있는 요청 속성으로 사용할 수 있습니다.

String originalRequestURI = request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI); 

if (originalRequestURI != null) { 
    // It was forwarded. Now get the query string as follows. 
    String originalQueryString = request.getAttribute(RequestDispatcher.FORWARD_QUERY_STRING); 
} 

참고 : 오래된 서블릿 API 버전에서 대신 키를 hardcode해야합니다.

String originalRequestURI = request.getAttribute("javax.servlet.forward.request_uri"); 
// ... 
+0

답변 주셔서 감사 드리며, 시도해보고 업데이트를 게시합니다. – Iravanchi